Sobes.tech
Senior

Milyen szinkronizációs primitíveket ismer?

sobes.tech MI

Válasz az MI-től

Go nyelvben több alapvető szinkronizációs primitív van a forrásokhoz való konkurrent hozzáférés kezelésére:

  • Mutex (sync.Mutex) — biztosítja a kölcsönös kizárást, blokkolva a hozzáférést a kritikus szekcióhoz.
  • RWMutex (sync.RWMutex) — kiterjesztett mutex, amely lehetővé teszi több olvasónak, hogy egyszerre olvassanak, de blokkolja az írást.
  • WaitGroup (sync.WaitGroup) — lehetővé teszi, hogy várjunk egy csoport goroutine befejezésére.
  • Cond (sync.Cond) — feltételes változó, amely értesíti a goroutine-okat egy esemény bekövetkezéséről.
  • Atomi műveletek (sync/atomic) — alacsony szintű műveletek változók atomikus olvasására és írására.

Ezen kívül, Go-ban széles körben használnak csatornákat (channels), amelyek lehetővé teszik a goroutine-ok szinkronizálását és adatok átadását közöttük anélkül, hogy explicit mutexeket használnánk.

Mutex példája:

var mu sync.Mutex
var counter int

func increment() {
    mu.Lock()
    defer mu.Unlock()
    counter++
}

WaitGroup példája:

var wg sync.WaitGroup
wg.Add(2)
go func() {
    defer wg.Done()
    // munka
}()
go func() {
    defer wg.Done()
    // munka
}()
wg.Wait()