Sobes.tech
Senior

Biztonságos a párhuzamos hozzáférés egy szelethez? Lesz versenyhelyzet, ha 4 goroutine módosítja mindegyik a saját egyedi indexét a szeletben?

sobes.tech MI

Válasz az MI-től

Go-ban a konkurrent hozzáférés egy szelethez önmagában nem biztonságos, mivel egy szelet egy olyan struktúra, amely egy mutatót tartalmaz egy tömbre, egy hosszúságot és egy kapacitást. Azonban, ha 4 goroutine mindenki a saját egyedi indexét módosítja a szeletben, és nem változtatják meg a hosszúságot vagy a kapacitást, akkor nem lesz versenyhelyzet, mert minden goroutine egy külön elemmel dolgozik.

Fontos, hogy:

  • A szeletet előre lefoglalják a szükséges méretben.
  • Írás közben nem változik a szelet szerkezete (például, append segítségével).

Példa:

s := make([]int, 4)
var wg sync.WaitGroup
wg.Add(4)
for i := 0; i < 4; i++ {
    go func(i int) {
        defer wg.Done()
        s[i] = i * 10
    }(i)
}
wg.Wait()

Ebben a példában nem lesz versenyhelyzet, mert minden goroutine egyedi indexre ír.

Ha több goroutine is változtathatja a szelet hosszát vagy ugyanazzal az indexszel dolgozik, szinkronizáció szükséges.