2016-05-07 7 views
0

GCDシリアルスレッド実行フロー

-(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"); 

} 

次のように出力される2,1,4,3

私の知る通り、それは2、4、1,3なり誰でも知っている

答えて

2

ここで保証される唯一の順序は、2の後に4が起こり、1の後に3が起こるということです。これは、カスタムキューとメインキューの両方がシリアルなので、ブロックがスケジュールされた順序。

ただし、serialQueueは、(現在のスレッドにログインしてみて)背景スレッドにブロックを実行しているので - あなたの1と3の操作は、あなたの2及び4の動作と同時に起こっています。

したがって、シリアルキューの操作とメインキューの操作の間の順序は、定義されていません。

メインキューにディスパッチするようにdispatch_asyncを変更した場合は、スケジューリングするブロックがメインキューを待つ必要があるため、実際には(2,4,1,3)の順序が必要になります。現在のタスクの実行を終了します(あなたの2と4の操作+メインキューが行っている他の操作)。

関連する問題