dispatch_barrier_async, 需要等待前面的任务并发执行完毕, 后面的任务需要等待 barrier 的任务执行完毕, 才能开始并发执行后面的任务.
dispatch_barrier_sync, 功能同上.
这两个 barrier 的不同, 主要体现在阻塞当前线程上会有什么不同, 而不是说阻塞那个队列中的任务会有什么不同.
dispatch_barrier_async 如下图:
可以看出, barrier 并没有阻塞到 aa 和 bb 的执行. barrier_async 不会阻塞当前线程. dispatch_barrier_async 会为 block 任务可能 (如果线程池中有可用的, 会直接使用) 会开辟一个新线程.
dispathc_barrier_sync 运行结果如下:
dispatch_barrier_sync 是会阻塞当前线程, 并且是在当前线程执行的 block, 不会创建新的线程.
By the way:
从任务执行上可以看出, dispatch_async 会创建线程, 也就是是 GCD 在使用过程中, 用户是不需要去创建和管理, 启动线程的, 使用户专注于任务的执行.
dispatch_sync 是不会创建线程的.
如果是串行队列, dispatch_barrier_sync:
改为 dispatch_sync, 结果一样. 可以得出这样的结论:
1. 在串行队列中, dispatch_barrier_sync 和 dispatch_barrier_async 功能一样.
2.dispatch_async 会创建新的线程, 如果是串行队列, 那么只开启一个线程. 任务按照加入的顺序执行.
3.dispatch_sync 不会创建新的线程, 按照上述的例子, sync 添加在串行队列中的, 都是在主线程中执行的.
4. 串行队列中的任务不一定在同一个线程中.
顺手, 我们看一下在串行队列上, 执行 sync 和 async:
在这个串行队列中执行的任务, 前几个通过 sync 的是在 main 线程上执行的, 后面的则是在子线程中执行的. sync 不会创建线程, async 会创建, 但是在串行队列中, async 只会创建一个队列.
如果是串行队列, dispatch_barrier_async:
都是在同一个线程中, dispatch_async 和 dispatch_barrier_async 效果一样.
来源: http://www.jianshu.com/p/86b05ecbda71