例からdispatch_sync内で呼び出されたときに内部的に何が起こる:はdispatch_applyが同じ同時キュー
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
});
}
});
操作は上で実行されるコードは、実装の詳細の多いスレッド同じキューにエンキューされる。