[解決済み] シリアルキューにおける dispatch_async と dispatch_sync の違い?
2022-07-05 18:47:57
質問
このようなシリアルキューを作成しました。
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
の前に実行され、完了します。
どのように解決するのですか?
はい、そうです。シリアルキューを使用すると、タスクの連続実行が保証されます。唯一の違いは
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
関連
-
dyld: ライブラリがロードされていません。エラーの解決
-
IOS8 Development Guide Error Thread 1: signal SIGABRT
-
[解決済み] アトミック属性と非アトミック属性の違いは何ですか?
-
[解決済み] プロセスとスレッドの違いは何ですか?
-
[解決済み] wait()とsleep()の違いについて
-
[解決済み] Xcode 6のバグ:Interface Builderファイル内の不明なクラス
-
[解決済み] アプリのプレビュー用にiOSシミュレータのビデオをキャプチャー
-
[解決済み] インポート vs #インポート - iOS 7
-
[解決済み】非同期プログラミングとマルチスレッドの違いは何ですか?
-
[解決済み] GCDにおける並列キューと直列キュー
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[iOS]コンパイルエラー:ld: アーキテクチャ x86_64 のシンボルが見つかりません。
-
[解決済み] Xcodeにおけるバージョンとビルドの比較
-
[解決済み] Objective-Cで文字列が空かどうかをテストするにはどうすればよいですか?
-
[解決済み] Xcode 6のバグ:Interface Builderファイル内の不明なクラス
-
[解決済み] iOS 13 のフルスクリーンでモーダルを表示する
-
[解決済み] UIViewに角丸をつける
-
[解決済み] Swiftを使用してアプリのバージョンとビルド番号を取得するにはどうすればよいですか?
-
[解決済み] iphoneアプリのベータテストはどのように行うのですか?
-
[解決済み] セキュリティで保護されたWebサービスにもアクセスするiOSアプリで、Facebook認証を行うためのデザイン
-
[解決済み] ぼかしの入ったオーバーレイビューの作成