Sobes.tech
Junior — Middle

Ako odstrániť závodné podmienky, ktoré vznikajú pri súčasnom prístupe k zdrojom v prostredí s viacerými vláknami?

sobes.tech AI

Odpoveď od AI

Aby ste predišli podmienkam súťaže v prostredí s viacerými vláknami v Go, môžete použiť niekoľko prístupov:

  1. Mutexy (sync.Mutex) — blokujú prístup ku zdieľaným zdrojom, umožňujúc iba jednej gorutine pracovať s nimi naraz.

  2. Kanály (channels) — zabezpečujú bezpečnú výmenu dát medzi gorutinami, čím sa vyhýbajú priamej manipulácii s spoločnými premennými.

  3. Balík sync/atomic — poskytuje atómové operácie pre prácu s primitívnymi typmi, čo pomáha predchádzať podmienkam súťaže pri jednoduchých operáciách.

Príklad s mutexom:

import (
    "sync"
)

var mu sync.Mutex
var counter int

func increment() {
    mu.Lock()
    defer mu.Unlock()
    counter++
}

Použitie kanálov:

ch := make(chan int)

func worker() {
    for val := range ch {
        // spracovanie val
    }
}

func main() {
    go worker()
    ch <- 42
    close(ch)
}

Výber metódy závisí od konkrétnej úlohy a štruktúry programu.