GCD柵欄函數

什麼是dispatch_barrier_async函數

dispatch_barrier_async函數的作用是在進程管理中起到一個柵欄的作用,它等待所有位於barrier函數之前的操作執行完畢後執行,並且在barrier函數執行之後,barrier函數之後的操作纔會得到執行,該函數需要同dispatch_queue_create函數生成的concurrent Dispatch Queue隊列一起使用
//第一種 實質上還是異步函數
dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);

//第二種 實質上還是同步函數
dispatch_barrier_sync(dispatch_queue_t queue, dispatch_block_t block);

<二>dispatch_barrier_async函數的作用

1.實現高效率的數據庫訪問和文件訪問

2.避免數據競爭

<三>dispatch_barrier_async實例

複製代碼
- (void)barrier
{
  //同dispatch_queue_create函數生成的concurrent Dispatch Queue隊列一起使用
dispatch_queue_t queue = dispatch_queue_create(“12312312”, DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue, ^{
    NSLog(@"----1-----%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
    NSLog(@"----2-----%@", [NSThread currentThread]);
});

dispatch_barrier_async(queue, ^{
    NSLog(@"----barrier-----%@", [NSThread currentThread]);
});

dispatch_async(queue, ^{
    NSLog(@"----3-----%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
    NSLog(@"----4-----%@", [NSThread currentThread]);
});

}
複製代碼
輸出結果:1 2 –> barrier –>3 4 其中12 與 34 由於並行處理先後順序不定

在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函數一般都會用異步的,省心,不擔心死鎖.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章