objective-c - 同じコンカレントキューからdispatch_sync内でdispatch_applyが呼び出されたときに内部で何が発生するか

objective-c c multithreading macos grand-central-dispatch

例:

dispatch_sync(someConcurrentQueue, ^(){
    dispatch_apply(5,someConcurrentQueue, ^(size_t i){
        // do some non-thread safe operation
     });
});


私はこれをテストすることに決め、スレッドセーフでない操作が期待どおりに実行されることに気付きました。しかし、グローバルキューを使用してdispatch_syncを呼び出すと、状況はすぐに悪化しました。

だから私の質問は:
1.そのような通話で、内部で何が起こっていますか?
2. dispatch_applyのすべての反復は、独自のスレッドでプリエンプティブにスケジュールされてから、順次実行されますか?
3. 2の答えが「はい」の場合、無限ループ内でこれを実行すると、パフォーマンスが向上しますか?その理由は、操作が再びループするのではなく、最後の操作が終了するとすぐに実行を開始できるということです。
答え
これは大体同じです:

dispatch_sync(someConcurrentQueue, ^(){
    for (size_t i = 0; i < 5; ++i){
        dispatch_async(someConcurrentQueue, ^(){
            // do some non-thread safe operation
        });
    }
});


操作は同じキューにエンキューされます。コードが実行されるスレッドは、実装の詳細です。したがって、これを無限ループで実行すると、次のようになります。


同期する
非同期(0)
非同期(1)
非同期(2)
非同期(3)
非同期(4)
同期する
...


dispatch_syncがスケジュールされると(実行されないで)次のdispatch_applyが実行されるので、キューのサイズが急速に増加します。
関連記事

objective-c - NSOutlineView:shouldEditTableColumn:が2回呼び出されるのはなぜですか?

objective-c - iOS MemoryWatchクラス

objective-c - コアデータの軽量な移行とiOS 5での再帰的な関係

iphone - iphoneスピーチをテキストに、またはその逆をsiriで

objective-c - NSOperationQueueが終了したかどうか、および操作が失敗したかどうかを確認するにはどうすればよいですか?

objective-c - iOS:「フリップクロック」アニメーション-方法[閉まっている]

objective-c - クラスのインスタンス化に関するObj-C iPhoneアーキテクチャ

objective-c - GET / POSTメソッドを使用してGoogleスプレッドシートを読み書きできますか

objective-c - iPad向きチェックUIViewクラス?

objective-c - ココア:407 HTTP応答cfnetworkの処理