Middle
Hoe voorkom je racecondities? Hoe werkt een Mutex?
sobes.tech AI
Antwoord van AI
Gegevensrace ontstaat wanneer meerdere goroutines gelijktijdig toegang krijgen tot een gedeelde bron voor lezen en schrijven zonder synchronisatie, wat leidt tot onvoorspelbare resultaten.
Om gegevensraces in Go te voorkomen, worden synchronisatie-mechanismen zoals sync.Mutex gebruikt. Een Mutex (mutual exclusion) is een primitive die garandeert dat slechts één goroutine tegelijk een kritieke sectie van de code kan uitvoeren.
Werking van de Mutex:
- Voordat toegang wordt verkregen tot de gedeelde bron, roept de goroutine
Lock()op, waardoor de mutex wordt geblokkeerd. - Als de mutex al geblokkeerd is, wacht de goroutine tot deze wordt vrijgegeven.
- Na voltooiing van de bewerking met de bron, wordt
Unlock()aangeroepen om de mutex vrij te geven.
Voorbeeld van het gebruik van Mutex in Go:
import (
"fmt"
"sync"
)
func main() {
var mu sync.Mutex
teller := 0
increment := func() {
mu.Lock()
defer mu.Unlock()
teller++
}
var wg sync.WaitGroup
for i := 0; i < 1000; i++ {
wg.Add(1)
go func() {
defer wg.Done()
increment()
}()
}
wg.Wait()
fmt.Println("Teller:", teller)
}
Op deze manier voorkomt het gebruik van Mutex gelijktijdige toegang tot gedeelde gegevens en voorkomt het races.