次のようなシリアルキューを作成しました:
dispatch_queue_t _serialQueue = dispatch_queue_create("com.example.name", DISPATCH_QUEUE_SERIAL);
dispatch_async
このように呼ばれることとの違いは何ですか
dispatch_async(_serialQueue, ^{ /* TASK 1 */ });
dispatch_async(_serialQueue, ^{ /* TASK 2 */ });
そして、dispatch_sync
このシリアルキューでこのように呼び出されますか?
dispatch_sync(_serialQueue, ^{ /* TASK 1 */ });
dispatch_sync(_serialQueue, ^{ /* TASK 2 */ });
私の理解では、どのディスパッチメソッドが使用されるかに関係なく、TASK 1
が実行され、 の前に完了するということですTASK 2
ね?
ベストアンサー1
はい。シリアル キューを使用すると、タスクがシリアルに実行されます。唯一の違いは、dispatch_sync
ブロックが終了した後にのみ返されるのに対し、dispatch_async
キューに追加された後に返されるので、終了していない可能性があることです。
このコード
dispatch_async(_serialQueue, ^{ printf("1"); });
printf("2");
dispatch_async(_serialQueue, ^{ printf("3"); });
printf("4");
2413
または2143
または1234
と印刷されるが、1
常に3
このコード
dispatch_sync(_serialQueue, ^{ printf("1"); });
printf("2");
dispatch_sync(_serialQueue, ^{ printf("3"); });
printf("4");
常に印刷されます1234
注: 最初のコードについては、しません印刷します1324
。printf("3")
発送されるので後 printf("2")
タスクは実行できる。後発送されます。
タスクの実行時間は変わりません。このコードは常に次の内容を出力します。12
dispatch_async(_serialQueue, ^{ sleep(1000);printf("1"); });
dispatch_async(_serialQueue, ^{ printf("2"); });
何が起こったかは
- スレッド 1: 時間のかかるタスク (タスク 1) をシリアル キューに dispatch_async する
- スレッド2: タスク1の実行を開始
- スレッド 1: 別のタスク (タスク 2) をシリアル キューに dispatch_async する
- スレッド 2: タスク 1 が終了しました。タスク 2 の実行を開始します。
- スレッド 2: タスク 2 が完了しました。
そしていつも見る12