Sobes.tech
Middle

Čo sa stane, ak vykonáte synchronizovaný volanie na seba v hlavnom vlákne a prečo to povedie k vzájomnému zablokovaniu?

sobes.tech AI

Odpoveď od AI

Ak v hlavnom vlákne (main thread) iOS aplikácie vykonáte synchronné volanie na seba samého, napríklad cez DispatchQueue.main.sync, dôjde k vzájomnému zablokovaniu (deadlock).

Prečo sa to deje:

  • Hlavné vlákno je už obsadené vykonávaním aktuálneho kódu.
  • Pri synchronnom volaní sa pokúša spustiť blok kódu, ktorý má byť zaradený do fronty hlavného vlákna.
  • Ale hlavné vlákno nemôže tento blok spracovať, kým nedokončí aktuálny kód, a aktuálny kód čaká na dokončenie synchronného volania.

Výsledkom je situácia, kedy vlákno čaká samo na seba, a vykonávanie sa zastaví navždy.

Príklad v Swift:

DispatchQueue.main.sync {
    // Tento kód sa pokúša synchronne spustiť na hlavnom vlákne,
    // ale ak volanie prichádza z hlavného vlákna, vznikne deadlock
}