Middle
Kako izbeći trku u podacima? Kako radi Mutex?
sobes.tech АИ
Одговор од АИ
Kada više gorutina istovremeno pristupa zajedničkom resursu za čitanje i pisanje bez sinhronizacije, dolazi do trke podataka, što dovodi do nepredvidivih rezultata.
Da bi se izbegle trke podataka u Go, koriste se mehanizmi sinhronizacije poput sync.Mutex. Mutex (međusobno isključivanje) je primitiv koji garantuje da samo jedna gorutina može izvršiti kritičnu sekciju koda odjednom.
Princip rada Mutex-a:
- Pre pristupa zajedničkom resursu, gorutina poziva
Lock(), blokirajući mutex. - Ako je mutex već zaključan, gorutina čeka da se oslobodi.
- Nakon završetka rada sa resursom, poziva se
Unlock(), oslobađajući mutex.
Primer korišćenja Mutex-a u Go:
import (
"fmt"
"sync"
)
func main() {
var mu sync.Mutex
brojač := 0
inkrement := func() {
mu.Lock()
defer mu.Unlock()
brojač++
}
var wg sync.WaitGroup
for i := 0; i < 1000; i++ {
wg.Add(1)
go func() {
defer wg.Done()
inkrement()
}()
}
wg.Wait()
fmt.Println("Brojač:", brojač)
}
Na ovaj način, korišćenje Mutex-a sprečava istovremeni pristup deljenim podacima i eliminiše trke.