Sobes.tech
Principal

Prečo pridanie mutexu len na zápis ne rieši problém data race? Ako správne používať mutex na ochranu spoločnej premennej?

sobes.tech AI

Odpoveď od AI

Pridanie mutexu len na zápis ne rieši problém race condition, pretože:

  • Ak čítanie prebieha bez zámku, môže získať čiastočne aktualizované alebo nekonzistentné údaje, ak v tom momente iná gorutina alebo vlákno vykonáva zápis.
  • Race condition nastáva pri súčasnom prístupe ku zdieľanej premennej, keď aspoň jeden prístup je zápis, a chýba vhodná synchronizácia.

Správne použitie mutexu na ochranu zdieľanej premennej:

  • Zamknúť mutex pri čítaní aj zápise. To zabezpečí, že čítanie nebude prebiehať súčasne so zápisom.
  • Pri zápise, získať mutex, zmeniť údaje a potom mutex uvoľniť.
  • Pri čítaní, tiež získať mutex, prečítať údaje a potom mutex uvoľniť.

Príklad v Swift:

let mutex = DispatchSemaphore(value: 1)
var sharedData = 0

func writeData(newValue: Int) {
    mutex.wait()
    sharedData = newValue
    mutex.signal()
}

func readData() -> Int {
    mutex.wait()
    let value = sharedData
    mutex.signal()
    return value
}

Týmto spôsobom mutex zabezpečuje vzájomné vylúčenie a zabraňuje race condition pri prístupe ku zdieľanej premennej.