Отправка в параллельную очередь приводит к выполнению в основном потоке?

Документация Apple GCD гласит следующее:

GCD предоставляет и управляет очередями FIFO, к которым ваше приложение может отправлять задачи в виде блочных объектов. Блоки, отправленные в очереди отправки, выполняются в пуле потоков, полностью управляемом системой. Никакой гарантии не делается в отношении потока, на котором выполняется задача. GCD предлагает три вида очередей:

Означает ли это, что даже если я выдаю запрос, например

dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{...});

это может привести к тому, что блок кода будет выполнен в основном потоке? В этом случае кажется, что вызов dispatch_sync с параллельной очередью в основном потоке может привести к ситуации взаимоблокировки, в которой основной поток застревает в ожидании.

Правильно ли моя интерпретация документации GCD?

+1
источник поделиться
2 ответа

Да, похоже, что dispatch_sync для глобальной очереди может означать выполнение кода в основном потоке, если вызывающий объект находится в основном потоке. Документация для dispatch_sync объясняет:

В качестве оптимизации эта функция, когда это возможно, вызывает блок на текущем потоке.

dispatch_sync всегда планирует блок на главной теме

+1
источник

Поскольку dispatch_sync ожидает завершения блока, на самом деле не имеет большого значения, выполняется ли блок в параллельном потоке или в основном потоке; в любом случае, главный поток заблокирован.

Поэтому вызов dispatch_sync из основного потока эффективно блокирует основной поток до тех пор, пока блок не будет закончен и, следовательно, будет плохой идеей, если блок не будет выполняться в течение короткого времени.

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос