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
}