Senior
Milyen szinkronizációs primitívek vannak Go-ban? Miben különbözik az RWMutex egy szokásos Mutex-tól?
sobes.tech MI
Válasz az MI-től
Go nyelvben a szinkronizációhoz a sync csomag primitívjeit használjuk, amelyek közül a főek:
- Mutex — egy egyszerű mutex a kölcsönös kizáráshoz, blokkolja a hozzáférést az erőforráshoz minden más goroutine számára, amíg fel nem oldják.
- RWMutex — egy mutex az olvasás és írás elkülönítésével. Lehetővé teszi több goroutine számára, hogy egyszerre olvassanak adatokat (RLock), de az írás (Lock) kizárólagos és mindenkit blokkol.
- WaitGroup — a goroutine-ok befejezésének várására.
- Cond — egy feltételes változó a goroutine-ok közötti jelzéshez.
Az RWMutex és a Mutex közötti különbség:
- A Mutex teljes hozzáférést blokkol, csak egy tulajdonos engedélyezett.
- Az RWMutex lehetővé teszi több olvasónak, hogy egyszerre tartsa a zárolást, ha nincsenek írók.
- Az írás az RWMutex-szel kizárólagos és blokkol minden mást.
Példa:
var mu sync.RWMutex
var data int
func readData() int {
mu.RLock() // olvasási zárolás
defer mu.RUnlock()
return data
}
func writeData(val int) {
mu.Lock() // kizárólagos írási zárolás
defer mu.Unlock()
data = val
}
Az RWMutex használata növeli a teljesítményt olyan forgatókönyvekben, ahol gyakori az olvasás és ritka az írás.