2013-04-08 7 views
5

Ich denke, der beste Weg, diese Frage zu stellen mit einigem Code ist:Welches Verhalten ist bei Grand Central Dispatch in Objective-C garantiert?

//Main method 
for(int i = 0; i < 10; i++) 
{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     [self foo:i]; 
    }); 

} 

- (void) foo: (int) i 
{ 
    @synchronized(self) 
    { 
     NSLog(@"%d",i); 
    } 
} 

In diesem Fall gewährleistet ist, dass die Zahlen 0-9 werden in der Reihenfolge ausgedruckt werden? Gibt es jemals eine Chance, dass einer der Threads, die in der Ausführungswarteschlange warten, übersprungen wird? Wie wäre es in Wirklichkeit? Realistisch, passiert das jemals? Was, wenn ich das obige Verhalten wollte (immer noch Threads verwendend); Wie könnte ich das erreichen?

+0

Threads und GCD-Blöcke werden nicht "übersprungen". Wenn ein Thread eine Ausnahme auslöst, werden Sie nie ohne einen expliziten try-catch wissen, da GCD auf die Ausnahmebehandlung verzichtet. – CodaFi

Antwort

15

In diesem Fall ist es garantiert, dass die Zahlen 0-9 in Reihenfolge gedruckt werden?

Nr

Gibt es überhaupt eine Chance, dass einer der Threads, die auf der Laufwarteschlange wartet, wird übersprungen werden?

Unklar was "übersprungen" bedeutet. Wenn es bedeutet "werden die Blöcke in der Reihenfolge ausgeführt?" Die Antwort ist "wahrscheinlich, aber es ist ein Implementierungsdetail".

Wie wäre es mit der Realität? Realistisch, passiert das jemals?

Nicht relevant. Wenn Sie Code für den gleichzeitigen Zugriff schreiben, der auf Annahmen über realistische Implementierungsdetails basiert, schreiben Sie falschen Code für den gleichzeitigen Zugriff.

Was wäre, wenn ich das obige Verhalten wollte (immer noch mit Threads); Wie könnte ich dies erreichen?

Erstellen Sie eine serielle Dispatch-Warteschlange, und senden Sie diese Warteschlange in der Reihenfolge, in der Sie die auszuführenden Schritte benötigen. Beachten Sie, dass dies deutlich schneller ist als @synchronized() (natürlich würde @synchronized() für Sie sowieso nicht funktionieren, da es keine Garantie für die Bestellung, sondern nur für die Exklusivität ist).

+0

Können Sie bitte erklären, warum nicht? Von Apple-Dokumentation: "Parallele Warteschlangen (auch bekannt als eine Art globale Dispatch-Warteschlange) führen einen oder mehrere Tasks gleichzeitig aus, Tasks werden jedoch immer noch in der Reihenfolge gestartet, in der sie der Warteschlange hinzugefügt wurden." Bedeutet dies nicht, dass die Bestellung erfüllt wird? –

+7

Sie werden in der Reihenfolge gestartet, in der sie hinzugefügt werden, aber die Thread-Planung kann bedeuten, dass sie die Ausführung nicht in der gleichen Reihenfolge abschließen. –

+0

hab es geschafft, danke! –

0

Aus der Dokumentation von dispatch_get_global_queue

Blocks abgegeben diesen globalen gleichzeitige Warteschlangen können gleichzeitig gegeneinander ausgeführt werden.

Das bedeutet also, dass dort nichts garantiert ist. Sie übergeben einen Codeblock an die Warteschlange und die Warteschlange nimmt ihn von dort.

Verwandte Themen