Sobes.tech
Middle+

Jakie primitive synchronizacji goroutines istnieją w Go?

sobes.tech AI

Odpowiedź od AI

W języku Go do synchronizacji gorutyn używa się następujących podstawowych primitów:

  • Mutex (sync.Mutex) — zapewnia wzajemne wykluczanie, blokując dostęp do współdzielonych zasobów.
  • RWMutex (sync.RWMutex) — rozszerzenie Mutex, pozwalające wielu gorutynom na jednoczesne czytanie, ale blokujące zapis.
  • WaitGroup (sync.WaitGroup) — umożliwia oczekiwanie na zakończenie zestawu gorutyn.
  • Channel (chan) — kanał do przesyłania danych między gorutynami, zapewnia synchronizację przez przesyłanie wiadomości.
  • Once (sync.Once) — gwarantuje, że określona funkcja zostanie wykonana tylko raz.
  • Cond (sync.Cond) — zmienna warunkowa dla bardziej złożonej synchronizacji, np. oczekiwania na określony stan.

Przykład użycia WaitGroup i Mutex:

var mu sync.Mutex
var wg sync.WaitGroup
var counter int

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

func main() {
    wg.Add(3)
    go increment()
    go increment()
    go increment()
    wg.Wait()
    fmt.Println("Licznik:", counter)
}