コードを引く過程で、小さな葛藤に遭遇し、フェンス関数について、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関数は一般的に非同期で、安心して、デッドロックを心配しない.