Middle
Ce tipuri de mutex-uri oferă biblioteca standard Go?
sobes.tech AI
Răspuns de la AI
Biblioteca standard Go oferă două tipuri principale de mutex-uri în pachetul sync:
sync.Mutex: Un mutex de bază care asigură excluderea mutuală. Poate fi în două stări: blocat sau deblocat. Doar o gorutină poate menține blocarea la un moment dat.sync.RWMutex: Un mutex pentru citire/scriere. Permite mai multor gorutine să citească simultan (prinRLock), dar doar uneia să scrie (prinLock). Scrierea blochează toate operațiile (atât citire, cât și scriere).
Metode principale ale sync.Mutex:
| Metodă | Descriere |
|---|---|
Lock() |
Blochează mutex-ul. Dacă este deja blocat, gorutina apelantă se blochează până când este deblocat. |
Unlock() |
Deblochează mutex-ul. Panică dacă mutex-ul nu era blocat de gorutina apelantă. |
Metode principale ale sync.RWMutex:
| Metodă | Descriere |
|---|---|
Lock() |
Blochează mutex-ul pentru scriere. Blochează toate operațiile de citire și scriere. |
Unlock() |
Deblochează mutex-ul pentru scriere. Panică dacă mutex-ul nu era blocat pentru scriere. |
RLock() |
Blochează mutex-ul pentru citire. Nu blochează alte operații de citire. Se blochează dacă există o blocare de scriere. |
RUnlock() |
Deblochează mutex-ul pentru citire. Panică dacă mutex-ul nu era blocat pentru citire. |
RLocker() |
Returnează un Locker care folosește RLock și RUnlock. |
Exemplu de utilizare a sync.Mutex:
package main
import (
"fmt"
"sync"
"time"
)
var counter int
var mutex sync.Mutex
func increment() {
mutex.Lock() // Blochează mutex-ul
counter++
fmt.Printf("Counter: %d\n", counter)
mutex.Unlock() // Deblochează mutex-ul
}
func main() {
for i := 0; i < 10; i++ {
go increment()
}
time.Sleep(time.Second) // Așteaptă ca gorutinele să se termine
}
Exemplu de utilizare a sync.RWMutex:
package main
import (
"fmt"
"sync"
"time"
)
var data string
var rwMutex sync.RWMutex
func readData() {
rwMutex.RLock() // Blochează pentru citire
fmt.Printf("Citire date: %s\n", data)
rwMutex.RUnlock() // Deblochează pentru citire
}
func writeData(newData string) {
rwMutex.Lock() // Blochează pentru scriere
data = newData
fmt.Printf("Scriere date: %s\n", data)
rwMutex.Unlock() // Deblochează pentru scriere
}
func main() {
go writeData("Salut")
time.Sleep(100 * time.Millisecond) // Așteaptă pentru scriere
for i := 0; i < 5; i++ {
go readData() // Multe citiri simultane sunt permise
}
time.Sleep(time.Second) // Așteaptă ca gorutinele să se termine
go writeData("Lume")
time.Sleep(100 * time.Millisecond)
go readData()
time.Sleep(time.Second) // Așteaptă finalizarea
}