Как я могу проверить, что я работаю в данной очереди 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()
сделать сравнения, как это, и я вижу эту формулировку в заголовках:
Recommended for debugging and logging purposes only:
The code must not make any assumptions about the queue returned, unless it is one of the global queues or a queue the code has itself created. The code must not assume that synchronous execution onto a queue is safe from deadlock if that queue is not the one returned by dispatch_get_current_queue().
Кроме того, в iOS 6.0 (но пока не для Mountain Lion) заголовки GCD теперь помечают эту функцию как устаревшую.
Похоже, я не должен использовать эту функцию таким образом, но я не уверен, что мне следует использовать вместо нее. Для функции, подобной приведенной выше, предназначенной для основной очереди, я мог бы использовать[NSThread isMainThread]
, но как я могу проверить, запущен ли я в одной из моих пользовательских последовательных очередей, чтобы я мог предотвратить взаимоблокировку?