Junior — Middle
Hogyan lehet megszüntetni az adatok versenyhelyzetét, amely akkor fordul elő, amikor több szál egyidejűleg fér hozzá az erőforrásokhoz?
sobes.tech MI
Válasz az MI-től
A versenyhelyzetek elkerülése érdekében több szálú környezetben Go-ban több megközelítés is alkalmazható:
-
Mutexek (sync.Mutex) — blokkolják a hozzáférést a megosztott erőforrásokhoz, lehetővé téve, hogy csak egy goroutine dolgozzon velük egyszerre.
-
Csatornák (channels) — biztonságos adatcsere szervezése goroutine-ok között, elkerülve a közös változók közvetlen hozzáférését.
-
sync/atomic csomag — atomikus műveleteket biztosít primitív típusokkal való munkához, segítve az egyszerű műveletekben fellépő versenyhelyzetek elkerülését.
Példa mutex-szel:
import (
"sync"
)
var mu sync.Mutex
var counter int
func increment() {
mu.Lock()
defer mu.Unlock()
counter++
}
Csatornák használata:
ch := make(chan int)
func worker() {
for val := range ch {
// val feldolgozása
}
}
func main() {
go worker()
ch <- 42
close(ch)
}
A módszer kiválasztása a konkrét feladattól és a program szerkezetétől függ.