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

  1. 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.

  2. 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.

  3. 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.