多线程中栅栏函数
2016-05-07 本文已影响1290人
奔哥小木屋
- 在撸代码的过程中,遇到一个小小的纠结的地方,有关于栅栏函数的,花费一个小时查了文档,记录下来
//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函数一般都会用异步的,省心,不担心死锁.