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?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zuordnen, was Kennung, die Sie wollen mit
dispatch_queue_set_specific()
. Sie können dann überprüfen Sie Ihre id mitdispatch_get_specific()
.Denken Sie daran, dass
dispatch_get_specific()
ist schön, weil es ' ll start in die aktuelle Warteschlange, und dann zu Fuß bis zum Ziel-Warteschlangen, wenn der Schlüssel nicht gesetzt ist, die auf der aktuellen. Diese in der Regel nicht die Materie, sondern können in einigen Fällen hilfreich sein.dispatch_set_current_target_queue
dass gilt nicht verwenden Sie eine Barriere blockieren. In der Tat, die header-Datei der Dokumentation für die es sagt, das ist, warum es da ist. Jedoch die header-Datei istprivate/queue_private.h
so können Sie erraten, Ihre beabsichtigte Verwendung 😉performBlockAndWait
hat das exakt gleiche Problem, und es scheint gut genug für Sie...Dies ist eine sehr einfache Lösung. Es ist nicht so performant wie mit
dispatch_queue_set_specific
unddispatch_get_specific
manuell – ich habe nicht die Metriken an.