2016-05-07 6 views
0

Im folgenden BeispielfunktionGCD Serienfaden Ausführungsfluß

-(void)testThred{ 
    dispatch_queue_t serialQueue = dispatch_queue_create("com.unique.name.queue", DISPATCH_QUEUE_SERIAL); 

    dispatch_async(serialQueue, ^{ 
     NSLog(@"1"); 
    }); 
    NSLog(@"2"); 

    dispatch_async(serialQueue, ^{ 
     NSLog(@"3"); 
    }); 
NSLog(@"4"); 

} 

der Ausgang als 2,1,4,3

folgt

nach meinem Wissen wird es sein, 2, 4, 1,3 anyone know how

Antwort

2

Die einzige Reihenfolge, die hier garantiert wird, ist, dass 4 nach 2 passieren wird, und 3 nach 1. Weil Ihre eigene Warteschlange und die Hauptwarteschlange seriell sind - und deshalb Blöcke in der ausgeführt werden Reihenfolge, in der sie geplant waren.

Da jedoch Ihre serialQueue wird Blöcke auf einem Hintergrund Thread ausführt (versuchen, den aktuellen Thread logging) - Ihre 1 und 3 Operationen geschieht gleichzeitig mit 2 und 4-Operationen.

Daher ist die genaue Reihenfolge zwischen den Vorgängen in Ihrer seriellen Warteschlange und den Vorgängen in der Hauptwarteschlange nicht definiert.

Wenn Sie Ihre dispatch_async geändert Haupt Warteschlange zu schicken, dann erhalten Sie in der Tat die Bestellung Sie wollen (2, 4, 1, 3) - wie die Blöcke, die Sie für die Hauptwarteschlange wird warten müssen, planen zu Beenden Sie die Ausführung der aktuellen Aufgabe (Ihre 2 und 4 Operationen + was auch immer die Hauptwarteschlange tut).