Возможно ли выполнение блока с dispatch_async в глобальной очереди для выполнения в главном потоке?

Если я скажу, что время от времени может случиться так, что основной поток может быть занят некоторыми задачами global_queue?

Например. У меня есть какая-то задача, и я использую одно из следующих утверждений:

    dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)) {
      // task 1
    }

// or

    dispatch_async(dispatch_get_global_queue(QOS_CLASS_UTILITY, 0)) {
      // task 2
    }

Возможно ли случайно получить эти задачи в главном потоке? Или это невозможно, потому что основной поток заблокирован для глобальных очередей? Спасибо!

2 ответа

Решение

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

Вы спросили: "Но если основной поток простаивает, он может взять задачу из global_queue". Нет, это было бы полностью упущением. Если основная очередь простаивает, то все процессоры доступны для выполнения фоновых задач, поэтому фоновые потоки работают немного быстрее. Для основной очереди было бы бессмысленно и неправильно брать задачу из другой очереди.

На практике этого не должно происходить, однако, когда вы получаете очередь, указав класс QOS, полученная очередь, строго говоря, является деталью реализации, и вы не должны полагаться на то, что она представляет собой конкретную очередь (или не является конкретной queue.) Кроме того, какие потоки использует любая заданная очередь для выполнения работы, поставленной в очередь к ней, также является деталью реализации.

Но на практике нет, я бы не ожидал увидеть работу в QOS_CLASS_BACKGROUND или же QOS_CLASS_UTILITY выполняется в главном потоке.

Если вы хотите убедить себя, вы можете проверить, вернулась ли очередь из dispatch_get_global_queue(QOS_CLASS_UTILITY, 0) == dispatch_get_main_queue() и аналогично, в вашем рабочем блоке вы можете проверить [NSThread isMainThread] чтобы увидеть, выполняете ли вы в главном потоке.

Другие вопросы по тегам