作用
- 实现高效率的数据库访问和文件访问
- 避免数据竞争
前提条件
- 必须使用
dispatch_queue_create
创建队列 - 且队列属性为
DISPATCH_QUEUE_CONCURRENT
(注意:使用dispatch_barrier_async
,该函数只能搭配自定义并行队列dispatch_queue_t
使用。不能使用:dispatch_get_global_queue
,否则dispatch_barrier_async
的作用会和dispatch_async
的作用一模一样。 )
dispatch_queue_t queue = dispatch_queue_create("queue", 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]);
});
结果
2017-06-30 17:34:11.889 test[50672:716568] --1---<NSThread: 0x6080000792c0>{number = 3, name = (null)}
2017-06-30 17:34:11.889 test[50672:716586] --2---<NSThread: 0x600000079f80>{number = 4, name = (null)}
2017-06-30 17:34:11.889 test[50672:716586] --barrier---<NSThread: 0x600000079f80>{number = 4, name = (null)}
2017-06-30 17:34:11.889 test[50672:716586] --3---<NSThread: 0x600000079f80>{number = 4, name = (null)}
2017-06-30 17:34:11.889 test[50672:716568] --4---<NSThread: 0x6080000792c0>{number = 3, name = (null)}
其中 --barrier---
前的和后的是不确定的,但3,4 一定在1,2 后面执行
参考链接