Как я могу проверить, что я работаю в данной очереди GCD без использования dispatch_get_current_queue ()?
Недавно мне понадобилась функция, которую я мог бы использовать для гарантии синхронного выполнения данного блока в определенной очереди последовательной отправки. Была возможность, что эта общая функция могла быть вызвана из чего-то, уже запущенного в этой очереди, поэтому мне нужно было проверить этот случай, чтобы предотвратить взаимоблокировку при синхронной отправке в ту же очередь.
Я использовал код, подобный следующему, чтобы сделать это:
void runSynchronouslyOnVideoProcessingQueue(void (^block)(void))
{
dispatch_queue_t videoProcessingQueue = [GPUImageOpenGLESContext sharedOpenGLESQueue];
if (dispatch_get_current_queue() == videoProcessingQueue)
{
block();
}
else
{
dispatch_sync(videoProcessingQueue, block);
}
}
Эта функция основана на использованииdispatch_get_current_queue()
чтобы определить идентичность очереди, в которой выполняется эта функция, и сравнивает ее с целевой очередью. Если там'Если он совпадает, он знает, что нужно просто запустить блок без отправки в эту очередь, потому что функция уже запущена в нем.
мы слышали противоречивые мнения о том, правильно ли это использоватьdispatch_get_current_queue()
сделать сравнения, как это, и я вижу эту формулировку в заголовках:
Рекомендуется только для целей отладки и ведения журнала:
Код не должен делать никаких предположений о возвращаемой очереди, если только это не одна из глобальных очередей или очередь, которую сам код создал. Код не должен предполагать, что синхронное выполнение в очереди защищено от тупиковой ситуации, если эта очередь не та, которую возвращает dispatch_get_current_queue ().
Кроме того, в iOS 6.0 (но пока не для Mountain Lion) заголовки GCD теперь помечают эту функцию как устаревшую.
Похоже, я не должен использовать эту функцию таким образом, но яЯ не уверен, что я должен использовать на своем месте. Для функции, подобной приведенной выше, предназначенной для основной очереди, я мог бы использовать[NSThread isMainThread]
, но как я могу проверить,работает в одной из моих пользовательских последовательных очередей, чтобы я мог предотвратить взаимоблокировку?