Sobes.tech
Middle

Jak odstranit závody při konkurenční práci vláken pomocí GCD?

sobes.tech AI

Odpověď od AI

V GCD (Grand Central Dispatch) se při práci s více vlákny používá synchronizace přístupu ke sdíleným zdrojům k prevenci závodů. Hlavní přístupy:

  • Použití sekvenčních (serial) front: pokud všechny operace se sdíleným zdrojem probíhají v jedné sekvenční frontě, budou prováděny postupně, čímž se zabrání současnému přístupu.

  • Použití bariér (barrier blocks) v konkurenčních frontách: bariéry zajišťují, že všechny předchozí úkoly jsou dokončeny před začátkem bariéry, a následující úkoly začínají po ní.

Příklad použití sekvenční fronty k ochraně zdroje:

let serialQueue = DispatchQueue(label: "com.example.serialQueue")
var sharedResource = 0

func incrementResource() {
    serialQueue.async {
        sharedResource += 1
        print("Zdroj zvýšen na \(sharedResource)")
    }
}

Tímto způsobem operace se sharedResource nebudou provádět současně, což zabraňuje závodům.