Sobes.tech
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.