¿Cómo puedo verificar que estoy ejecutando en una cola GCD dada sin usar dispatch_get_current_queue ()?

Recientemente, tuve la necesidad de una función que pudiera usar para garantizar la ejecución sincrónica de un bloque determinado en una cola de envío serial en particular. Existe la posibilidad de que se pueda llamar a esta función compartida desde algo que ya se está ejecutando en esa cola, por lo que tuve que verificar este caso para evitar un interbloqueo de un envío síncrono a la misma cola.

Usé código como el siguiente para hacer esto:

void runSynchronouslyOnVideoProcessingQueue(void (^block)(void))
{
    dispatch_queue_t videoProcessingQueue = [GPUImageOpenGLESContext sharedOpenGLESQueue];

    if (dispatch_get_current_queue() == videoProcessingQueue)
    {
        block();
    }
    else
    {
        dispatch_sync(videoProcessingQueue, block);
    }
}

Esta función se basa en el uso dedispatch_get_current_queue() para determinar la identidad de la cola, esta función se está ejecutando y la compara con la cola de destino. Si hay una coincidencia, sabe que solo debe ejecutar el bloque en línea sin el envío a esa cola, porque la función ya se está ejecutando en él.

He escuchado cosas contradictorias sobre si era o no apropiado usardispatch_get_current_queue() para hacer comparaciones como esta, y veo esta redacción en los encabezados:

Recomendado solo para fines de depuración y registro:

El código no debe hacer suposiciones sobre la cola devuelta, a menos que sea una de las colas globales o una cola que el código mismo haya creado. El código no debe asumir que la ejecución síncrona en una cola está a salvo del interbloqueo si esa cola no es la devuelta por dispatch_get_current_queue ().

Además, en iOS 6.0 (pero todavía no para Mountain Lion), los encabezados de GCD ahora marcan esta función como obsoleta.

Parece que no debería usar esta función de esta manera, pero no estoy seguro de qué debo usar en su lugar. Para una función como la anterior que apuntaba a la cola principal, podría usar[NSThread isMainThread], pero ¿cómo puedo verificar si me estoy ejecutando en una de mis colas seriales personalizadas para evitar un punto muerto?

Respuestas a la pregunta(2)

Su respuesta a la pregunta