Sobes.tech
Middle

Co się stanie, jeśli w głównym wątku wykonasz synchroniczne wywołanie samego siebie i dlaczego to doprowadzi do wzajemnego blokowania?

sobes.tech AI

Odpowiedź od AI

Jeśli w głównym wątku (main thread) aplikacji iOS wykonasz synchroniczne wywołanie samego siebie, na przykład przez DispatchQueue.main.sync, spowoduje to wzajemne blokowanie (deadlock).

Dlaczego tak się dzieje:

  • Główny wątek jest już zajęty wykonywaniem bieżącego kodu.
  • Przy wywołaniu synchronicznym próbuje wykonać blok kodu, który musi zostać umieszczony w kolejce głównego wątku.
  • Ale główny wątek nie może obsłużyć tego bloku, dopóki nie zakończy bieżącego, a bieżący czeka na zakończenie wywołania synchronicznego.

W efekcie powstaje sytuacja, w której wątek czeka na siebie samego, a wykonanie zatrzymuje się na zawsze.

Przykład w Swift:

DispatchQueue.main.sync {
    // Ten kod próbuje wykonać się synchronicznie na głównym wątku,
    // ale jeśli wywołanie pochodzi z głównego wątku, dojdzie do deadlocka
}