Sobes.tech
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.