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效果一样。
网友评论