Sobes.tech
Middle

Jak można uniknąć wyścigu danych? Jak działa Mutex?

sobes.tech AI

Odpowiedź od AI

Wyścig danych występuje, gdy kilka gorutyn jednocześnie odwołuje się do wspólnego zasobu do odczytu i zapisu bez synchronizacji, co prowadzi do nieprzewidywalnych wyników.

Aby zapobiec wyścigom danych w Go, używa się mechanizmów synchronizacji, takich jak sync.Mutex. Mutex (mutual exclusion) to primitive, które gwarantuje, że tylko jedna gorutyna może wykonywać sekcję krytyczną kodu w danym czasie.

Zasada działania Mutex:

  • Przed dostępem do wspólnego zasobu gorutyna wywołuje Lock(), blokując mutex.
  • Jeśli mutex jest już zablokowany, gorutyna czeka na jego odblokowanie.
  • Po zakończeniu pracy z zasobem wywołuje się Unlock(), odblokowując mutex.

Przykład użycia Mutex w Go:

import (
    "fmt"
    "sync"
)

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

    zwieksz := func() {
        mu.Lock()
        defer mu.Unlock()
        licznik++
    }

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

W ten sposób użycie Mutex zapobiega jednoczesnemu dostępowi do danych współdzielonych i wyklucza wyścigi.