Возможно ли выполнение блока с 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]
чтобы увидеть, выполняете ли вы в главном потоке.