Sobes.tech
Middle

Kaip išvengti duomenų lenktynių? Kaip veikia Mutex?

sobes.tech AI

Atsakymas iš AI

Duomenų lenktynės įvyksta, kai keli gorutinai vienu metu prieina prie bendro ištekliaus skaityti ir rašyti be sinchronizacijos, kas sukelia nenuspėjamus rezultatus.

Norint išvengti duomenų lenktynių Go, naudojami sinchronizacijos mechanizmai, tokie kaip sync.Mutex. Mutex (tarpusavio išimtis) yra primitivas, kuris garantuoja, kad tik viena gorutina vienu metu gali vykdyti kritinį kodo segmentą.

Mutex veikimo principas:

  • Prieš prieidą prie bendro ištekliaus, gorutina iškviečia Lock(), užrakindama mutex.
  • Jei mutex jau užrakintas, gorutina laukia, kol jis bus atlaisvintas.
  • Baigus darbą su ištekliu, kviečiama Unlock(), atlaisvinant mutex.

Pavyzdys, kaip naudoti Mutex Go:

import (
    "fmt"
    "sync"
)

func main() {
    var mu sync.Mutex
    skaitiklis := 0

    padidinti := func() {
        mu.Lock()
        defer mu.Unlock()
        skaitiklis++
    }

    var wg sync.WaitGroup
    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            padidinti()
        }()
    }
    wg.Wait()
    fmt.Println("Skaitiklis:", skaitiklis)
}

Taip naudojant Mutex, išvengiama vienalaikio prieigos prie bendrų duomenų ir išvengiama lenktynių.