Я только что прочитал это на objc.io полностью асинхронно но не могу найти толкового объяснения
dispatch_queue_t queueA; // assume we have this
dispatch_sync(queueA, ^(){ // (a)
dispatch_sync(queueA, ^(){ // (b)
foo();
});
});
Как только мы попадаем во вторую команду dispatch_sync, мы заходим в тупик: мы не можем выполнить отправку в очередь A, потому что кто-то (текущий поток) уже находится в этой очереди и никогда не покинет ее.
пока я понимаю
dispatch_sync
просто добавьте рабочий элемент (я избегаю использования слова "блок", так как это может сбить с толку) в очередь A, затем этот рабочий элемент будет отправлен в целевую очередь queueA, после чего GCD сохранит поток threadWorkItem strong> для этого рабочего элемента- Когда я достигаю (b), я нахожусь в потоке threadWorkItem (предположим, что threadWorkItem — это имя этого потока), поэтому я думаю, что постановка в очередь другого рабочего элемента в очередь A невозможна. проблема. Но некоторые люди говорят, что в это время очередь A сохраняется, очередь A блокируется -> вызывает взаимоблокировку, что меня смущает.
Я уже прочитал много тем, связанных с этим, таких как Взаимоблокировка с помощью dispatch_sync, Почему мы не можем использовать dispatch_sync в текущей очереди?, Почему этот вызов dispatch_sync() зависает?, . .. но не могу найти хорошего объяснения. Кто-то говорит, что dispatch_sync
блокирует очередь, кто-то говорит, что блокирует текущий поток, ... :(
Так почему же это вызывает взаимоблокировку?