Welche GCD-Warteschlange, hauptsächlich oder nicht, laufe ich?

8

Ich versuche, einige Thread-sichere Methoden zu schreiben, also verwende ich:

%Vor%

Aber wenn ich auf dem Hauptthread bin, der nicht notwendig ist, und ich kann alle diese Dispatch-Anrufe überspringen, so würde ich gerne wissen, in welchem ​​Thread ich gerade bin. Wie kann ich das wissen?

Oder macht es vielleicht keinen Unterschied (in der Leistung) es zu tun?

Ist es in Ordnung, diesen Vergleich zu machen?

%Vor%     
nacho4d 09.02.2011, 08:25
quelle

7 Antworten

12

Aktualisierte Antwort :

Die Apple Docs haben sich geändert und sagen jetzt "Wenn diese Funktion außerhalb des Kontexts eines gesendeten Blocks aufgerufen wird, gibt sie die Hauptwarteschlange zurück, wenn der Aufruf vom Hauptthread ausgeführt wird. Wenn der Aufruf von einem anderen Thread ausgeführt wird, Diese Funktion gibt die Standardwarteschlange für die Warteschlange zurück. " also sollte dispatch_get_main_queue() == dispatch_get_current_queue() funktionieren.

Ursprüngliche Antwort :

Die Verwendung von dispatch_get_main_queue() == dispatch_get_current_queue() funktioniert nicht. Die Dokumente für dispatch_get_current_queue sagen "Wenn diese Funktion außerhalb des Kontexts eines gesendeten Blocks aufgerufen wird, gibt sie die Standardwarteschlange für die gleichzeitige Ausführung zurück". Die standardmäßig vorhandene Warteschlange ist nicht die Hauptwarteschlange.

[NSThread isMainThread] sollte für das funktionieren, was Sie wollen. Beachten Sie, dass [NSThread isMainThread] jedoch auch für andere Warteschlangen als die Hauptwarteschlange gelten kann, z. B. beim Aufrufen von dispatch_sync aus dem Hauptthread.

    
smparkes 11.02.2011, 01:25
quelle
7

Mit der Abschreibung von dispatch_get_current_queue() entspricht das Äquivalent von (dispatch_get_main_queue() == dispatch_get_current_queue())

ist jetzt durch einen Vergleich der Warteschlangenmarkierung, der lautet:

%Vor%     
ambientlight 08.01.2016 20:35
quelle
4

Aktualisierte Antwort:

dispatch_get_current_queue () ist jetzt veraltet.

Ursprüngliche Antwort:

Unter OS-X 10.8 wird in der Header-Datei (queue.h) im Kommentar über der Funktion dispatch_get_current_queue () geschrieben:

  

Wenn dispatch_get_current_queue () für den Haupt-Thread aufgerufen wird, kann dies der Fall sein   oder gibt möglicherweise nicht den gleichen Wert wie dispatch_get_main_queue () zurück.   Ein Vergleich der beiden ist kein gültiger Weg zu testen, ob Code ausgeführt wird   auf dem Hauptthread.

Ich habe das wegen eines

entdeckt

assert(dispatch_get_current_queue() == dispatch_get_main_queue());

in meinem Code, der unter iOS gut funktioniert, aber unter OS-X nicht funktioniert.

    
Gabriele Mondada 23.11.2012 20:04
quelle
2

Wenn Sie in Objective-C sind und synchron im Hauptthread auftreten sollen, wäre es nicht einfacher,

zu verwenden %Vor%

Dies hat den Vorteil, dass, wenn Sie bereits im Hauptthread sind, es keine Rolle spielt, die Nachricht wird auf die normale Weise gesendet.

    
JeremyP 09.02.2011 09:06
quelle
1

Es ist nicht sicher, dispatch_get_current_queue() zu verwenden, außer Sie debuggen nicht. Wie es klar geschrieben ist auf der Manpage dispatch_queue :

  

Höhlungen

     

Code kann keine Annahmen über die von dispatch_get_current_queue() zurückgegebene Warteschlange treffen. Die zurückgegebene Warteschlange kann über willkürliche Richtlinien verfügen, die Code möglicherweise überraschen, der versucht, mit der Warteschlange zu arbeiten. Die Liste der Richtlinien umfasst, ist aber nicht beschränkt auf, die Warteschlangenbreite (d. H. Seriell vs. gleichzeitig), die Planungspriorität, die Sicherheitsanmeldeinformationen oder die Dateisystemkonfiguration. Daher muss dispatch_get_current_queue() nur für Identitätstests oder Debugging verwendet werden.

Die bessere Sache (vielleicht komplizierter) ist, die Hintergrundthreads zu synchronisieren:

%Vor%

Vielleicht bin ich völlig falsch, aber das ist es, was ich vorschlage.

    
Madhup Singh Yadav 09.02.2011 08:57
quelle
0

Eigentlich ist es in Ordnung zu verwenden.

Die Dokumentation sagt

  

Wenn von außerhalb des Kontexts eines gesendeten Blocks aufgerufen wird, wird dies angezeigt   Funktion gibt die Hauptwarteschlange zurück, wenn der Aufruf vom main ausgeführt wird   Thread Wenn der Anruf von einem anderen Thread stammt, diese Funktion   Gibt die Standardwarteschlange für die Warteschlange zurück.

    
mikelikespie 24.10.2011 21:11
quelle
0

dispatch_get_current_queue ist ab iOS 6.0 veraltet. Sieht aus wie [NSThread isMainThread] ist der einzige Weg zu gehen.

    
Andrei Tchijov 27.08.2013 19:08
quelle