同步柵欄和異步柵欄都能夠阻塞隊列上的任務(wù),但是最大的區(qū)別在于能否阻塞當(dāng)前線程。
異步柵欄
dispatch_queue_t queue = dispatch_queue_create("TestQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
printf("1\n");
});
printf("2\n");
dispatch_barrier_async(queue, ^{
printf("3\n");
});
printf("4\n");
dispatch_async(queue, ^{
printf("5\n");
});
printf("~~~\n");
打印結(jié)果(運行了兩次)
2 1 4 ~~~ 3 5
2 4 ~~~ 1 3 5
(首先,我這里寫的是一個簡單的Demo,當(dāng)前線程是主線程)分析,由于是異步柵欄,那么他就沒有阻塞當(dāng)前線程的執(zhí)行.而且咱們把任務(wù)都放到一個并發(fā)線程上去執(zhí)行的(而且是異步任務(wù)).這個柵欄打印的3肯定不會阻攔當(dāng)前線程的2和4.也就是說2.4的順序是固定的.先執(zhí)行2.然后執(zhí)行4.然后對于柵欄3來講.因為攔住了1.那么1和5相對于3的位置也是確定的.1在3前面打印.5在3后面打印.其余1可能出現(xiàn)在2前面也可能出現(xiàn)在2后面的分析就不做了.畢竟之前講同步任務(wù)異步任務(wù)的時候講了
同步柵欄
dispatch_queue_t queue = dispatch_queue_create("TestQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
printf("1\n");
});
printf("2\n");
dispatch_barrier_sync(queue, ^{
printf("3\n");
});
printf("4\n");
dispatch_async(queue, ^{
printf("5\n");
});
printf("~~~\n");
打印結(jié)果(運行了兩次)
2 1 3 4 ~~~ 5
2 1 3 4 ~~~ 5
可以看出來.同步柵欄阻塞了當(dāng)前線程.3與之前的1.2未打印的話.4就不會走.
補充
dispatch_queue_t queue = dispatch_queue_create("TestQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
printf("1\n");
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:10];
printf("1--\n");
});
});
printf("2\n");
dispatch_barrier_sync(queue, ^{
printf("3\n");
});
printf("4\n");
dispatch_async(queue, ^{
printf("5\n");
});
printf("~~~\n");
輸出結(jié)果
2 1 3 4 ~~~ 5 1 --
和調(diào)度組的async和sync函數(shù)一樣不能阻塞任務(wù)里面新開異步任務(wù)刹帕。