Middle
Jak można uniknąć wyścigu danych? Jak działa Mutex?
sobes.tech AI
Odpowiedź od AI
Wyścig danych występuje, gdy kilka gorutyn jednocześnie odwołuje się do wspólnego zasobu do odczytu i zapisu bez synchronizacji, co prowadzi do nieprzewidywalnych wyników.
Aby zapobiec wyścigom danych w Go, używa się mechanizmów synchronizacji, takich jak sync.Mutex. Mutex (mutual exclusion) to primitive, które gwarantuje, że tylko jedna gorutyna może wykonywać sekcję krytyczną kodu w danym czasie.
Zasada działania Mutex:
- Przed dostępem do wspólnego zasobu gorutyna wywołuje
Lock(), blokując mutex. - Jeśli mutex jest już zablokowany, gorutyna czeka na jego odblokowanie.
- Po zakończeniu pracy z zasobem wywołuje się
Unlock(), odblokowując mutex.
Przykład użycia Mutex w Go:
import (
"fmt"
"sync"
)
func main() {
var mu sync.Mutex
licznik := 0
zwieksz := func() {
mu.Lock()
defer mu.Unlock()
licznik++
}
var wg sync.WaitGroup
for i := 0; i < 1000; i++ {
wg.Add(1)
go func() {
defer wg.Done()
zwieksz()
}()
}
wg.Wait()
fmt.Println("Licznik:", licznik)
}
W ten sposób użycie Mutex zapobiega jednoczesnemu dostępowi do danych współdzielonych i wyklucza wyścigi.