Wie kann ich überprüfen, ob ich in einer bestimmten GCD-Warteschlange ausgeführt werde, ohne dispatch_get_current_queue () zu verwenden?

Vor kurzem brauchte ich eine Funktion, mit der ich die synchrone Ausführung eines bestimmten Blocks in einer bestimmten Warteschlange für den seriellen Versand gewährleisten konnte. Es bestand die Möglichkeit, dass diese gemeinsam genutzte Funktion von einem Objekt aufgerufen werden konnte, das bereits in dieser Warteschlange ausgeführt wurde. Daher musste ich nach diesem Fall suchen, um zu verhindern, dass ein Deadlock bei einem synchronen Versand in dieselbe Warteschlange auftritt.

Ich habe dazu Code wie den folgenden verwendet:

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

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

Diese Funktion beruht auf der Verwendung vondispatch_get_current_queue() Um die Identität der Warteschlange zu bestimmen, wird diese Funktion ausgeführt und mit der Zielwarteschlange verglichen. Wenn es eine Übereinstimmung gibt, muss der Block einfach inline ausgeführt werden, ohne dass er an diese Warteschlange gesendet wird, da die Funktion bereits darauf ausgeführt wird.

Ich habe widersprüchliche Dinge darüber gehört, ob es richtig war, es zu benutzen oder nichtdispatch_get_current_queue() Vergleiche wie folgt machen, und ich sehe diesen Wortlaut in den Überschriften:

Empfohlen nur für Debug- und Protokollierungszwecke:

Der Code darf keine Annahmen über die zurückgegebene Warteschlange treffen, es sei denn, es handelt sich um eine der globalen Warteschlangen oder eine Warteschlange, die der Code selbst erstellt hat. Der Code darf nicht davon ausgehen, dass die synchrone Ausführung in einer Warteschlange vor einem Deadlock geschützt ist, wenn diese Warteschlange nicht von dispatch_get_current_queue () zurückgegeben wird.

In iOS 6.0 (aber noch nicht für Mountain Lion) markieren die GCD-Header diese Funktion jetzt als veraltet.

Es hört sich so an, als ob ich diese Funktion nicht auf diese Weise verwenden sollte, aber ich bin mir nicht sicher, was ich an ihrer Stelle verwenden soll. Für eine Funktion wie die oben genannte, die auf die Hauptwarteschlange abzielt, könnte ich verwenden[NSThread isMainThread], aber wie kann ich überprüfen, ob ich in einer meiner benutzerdefinierten seriellen Warteschlangen aktiv bin, um ein Deadlock zu verhindern?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage