Как я могу проверить, что я работаю в данной очереди 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], но как я могу проверить, запущен ли я в одной из моих пользовательских последовательных очередей, чтобы я мог предотвратить взаимоблокировку?

Ответы на вопрос(2)

Ваш ответ на вопрос