Junior — Middle
Ako odstrániť závodné podmienky, ktoré vznikajú pri súčasnom prístupe k zdrojom v prostredí s viacerými vláknami?
sobes.tech AI
Odpoveď od AI
Aby ste predišli podmienkam súťaže v prostredí s viacerými vláknami v Go, môžete použiť niekoľko prístupov:
-
Mutexy (sync.Mutex) — blokujú prístup ku zdieľaným zdrojom, umožňujúc iba jednej gorutine pracovať s nimi naraz.
-
Kanály (channels) — zabezpečujú bezpečnú výmenu dát medzi gorutinami, čím sa vyhýbajú priamej manipulácii s spoločnými premennými.
-
Balík sync/atomic — poskytuje atómové operácie pre prácu s primitívnymi typmi, čo pomáha predchádzať podmienkam súťaže pri jednoduchých operáciách.
Príklad s mutexom:
import (
"sync"
)
var mu sync.Mutex
var counter int
func increment() {
mu.Lock()
defer mu.Unlock()
counter++
}
Použitie kanálov:
ch := make(chan int)
func worker() {
for val := range ch {
// spracovanie val
}
}
func main() {
go worker()
ch <- 42
close(ch)
}
Výber metódy závisí od konkrétnej úlohy a štruktúry programu.