Wie kann ich überprüfen, dass ich bin läuft auf einem gegebenen GCD Warteschlange, ohne mit dispatch_get_current_queue()?

Vor kurzem hatte ich die Notwendigkeit für eine Funktion, die ich verwenden könnte, um zu garantieren, synchronen Ausführung einer gegebenen block auf einen bestimmten serielle dispatch queue. Es war die Möglichkeit, dass diese gemeinsame Funktion aufgerufen werden könnte, von etwas, das bereits auf die Warteschlange, so dass ich benötigt, um zu überprüfen, für diesen Fall, um zu verhindern, dass ein deadlock von einem synchronen Versand an die gleiche Warteschlange.

Benutzte ich einen code wie den folgenden zu tun:

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 von dispatch_get_current_queue() zu bestimmen, die Identität der Warteschlange an diese Funktion ausgeführt wird, und vergleicht dies mit der Ziel-queue. Wenn es eine übereinstimmung gibt, weiß es zu laufen, nur der block inline, ohne die Botschaft an, dass die Warteschlange, da die Funktion bereits ausgeführt wird.

Ich habe gehört, widersprüchliche Dinge darüber, ob oder nicht es war, richtig zu dispatch_get_current_queue() zu tun Vergleiche wie diese, und ich sehe diese Formulierung in den Kopf:

Empfohlen für debugging und Protokollierung nur:

Muss der code keine Annahmen über die Warteschlange zurückgegeben,
es sei denn, es ist einer der globalen Warteschlange oder eine Warteschlange der code hat sich
erstellt. Der code muss nicht davon ausgehen, dass die synchrone Ausführung auf einem
Warteschlange ist sicher von deadlock, wenn die Warteschlange ist nicht die, die durch zurückgegeben
dispatch_get_current_queue().

Darüber hinaus in iOS 6.0 (aber noch nicht für Mountain Lion), den GCD-Header markieren Sie nun diese Funktion als veraltet.

Es klingt wie ich, sollten Sie nicht verwenden diese Funktion in dieser Weise, aber ich bin mir nicht sicher was ich verwenden soll in seinen Platz. Für eine Funktion wie die oben genannten, die gezielt die Haupt-Warteschlange, die ich verwenden könnte [NSThread isMainThread], aber wie kann ich überprüfen, ob ich auf eine meiner benutzerdefinierten serielle Warteschlangen, so kann ich verhindern, dass ein deadlock?

InformationsquelleAutor Brad Larson | 2012-10-09
Schreibe einen Kommentar