有多个线程的任务,我们希望他们能依次访问某一资源或者执行某一操作,可以使用barrier。典型的应用是多个线程向NSMutableArry中添加数据(NSMutableArry不是线程安全的)。
1、barrier 的典型应用:
// 创建自定义并发队列
dispatch_queue_t queue = dispatch_queue_create("que", DISPATCH_QUEUE_CONCURRENT);
for (int i = 0; i < 10; i++) {
// 开启多个异步操作(将在多个线程执行)
dispatch_async(queue, ^{
// 这里执行耗时操作 ①
// 这里使用barrier异步操作
dispatch_barrier_async(queue, ^{
// 这里的操作会最后在一个线程里单独顺序执行 ③
});
// 这里执行耗时操作 ②
});
}
当代码执行到barrier的代码块的时候,这个代码块会被保留到所有的barrier
注意:
1、barrier里面的代码,会等到所有的操作都执行到barrier的时候,在一个单独的线程内顺序执行。
2、只在自定义并发队列里有效,全局并发队列内无效。