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函数一般都会用异步的,省心,不担心死锁.

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