シリアルキューのdispatch_asyncとdispatch_syncの違いは?質問する

シリアルキューのdispatch_asyncとdispatch_syncの違いは?質問する

次のようなシリアルキューを作成しました:

    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


注: 最初のコードについては、しません印刷します1324printf("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

おすすめ記事