2011-10-19 10 views
2

例から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 
     }); 
    } 
}); 

操作は上で実行されるコードは、実装の詳細の多いスレッド同じキューにエンキューされる。

答えて

2

これは概ね同じです。

  • 同期
  • 非同期(0)
  • 非同期(1)
  • 非同期(2)
  • 非同期(:あなたは無限ループにこれをしなかった場合にはそのようなものとして、それは次のようになります3)
  • 非同期(4)
  • 同期
  • ...

あなたの次のdispatch_syncが実行されると、dispatch_applyがスケジュールされている(実行されていない)と、キューのサイズが非常に急激に増加します。

関連する問題