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效果一樣。