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)
}