マルチスレッドフェンス関数

1647 ワード

  • コードを引く過程で、小さな葛藤に遭遇し、フェンス関数について、1時間かけてドキュメントを調べ、
  • を記録した.
    //GCD   C ,  barrier    
    //GCD  barrier       
    //              
    dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);
    
    //              
    dispatch_barrier_sync(dispatch_queue_t queue, dispatch_block_t block);
    
  • barrierの実際の用途では、いくつかの注意点があります:
  • //  barrier   async  sync,                    
    /* @discussion
     * Submits a function to a dispatch queue like dispatch_async_f(), but marks
     * that function as a barrier (relevant only on DISPATCH_QUEUE_CONCURRENT
     * queues).
     */
    
  • dispatch_barrier_async(dispatch_queue_t queue,dispatch_block_t block)/非同期
  • とdispatch_get_global_queue(0, 0);(グローバル同時キュー)とともに使用すると、フェンスの効果は得られず、公式ドキュメントでは述べています.
  • とdispatch_get_main_queue()(プライマリキュー列)とともに使用され、barrier前後のタスクがシリアルに実行され、UIスレッドで
  • が実行される.
  • とdispatch_queue_create(NULL,DISPATCH_QUEUE_SERIAL)(シリアルキュー)とともに使用すると、スレッドが作成され、barrier前後のタスクが
  • シリアルに実行されます.
  • とdispatch_queue_create(NULL,DISPATCH_QUEUE_CONCURRENT)(カスタムコンカレントキュー)とともに使用する、複数のスレッドを作成し、barrier前後のタスクは並列に実行する.

  • dispatch_barrier_sync(dispatch_queue_t queue,dispatch_block_t block)//同期
  • とdispatch_get_global_queue(0, 0);(グローバル同時キュー)とともに使用すると、フェンスの効果は得られず、公式ドキュメントでは述べています.
  • とdispatch_get_main_queue()(ホームチーム列)を併用すると、プログラムがデッドロック状態になります!!!(これは無視しやすい)
  • とdispatch_queue_create(NULL,DISPATCH_QUEUE_SERIAL)(シリアルキュー)とともに使用され、barrierはUIスレッドで
  • を実行する.
  • とdispatch_queue_create(NULL,DISPATCH_QUEUE_CONCURRENT)(カスタム同時キュー)とともに使用され、barrierはUIスレッドで
  • を実行する.
  • だから、barrier関数は一般的に非同期で、安心して、デッドロックを心配しない.