iOS開發(fā)系列-線程同步dispatch_barrier_(a)sync

參考

//參數1:將barrier添加到的隊列
//參數2:barrier執(zhí)行的block
void dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);
void dispatch_barrier_sync(dispatch_queue_t queue, dispatch_block_t block);

官方文檔關于該函數的文檔說明

說明:

共同點:

1功偿、等待在它前面插入隊列的任務先執(zhí)行完

2、等待他們自己的任務執(zhí)行完再執(zhí)行后面的任務

不同點:

1棋返、dispatch_barrier_sync將自己的任務插入到隊列的時候纯蛾,需要等待自己的任務結束之后才會繼續(xù)插入被寫在它后面的任務幸逆,然后執(zhí)行它們

2巡雨、dispatch_barrier_async將自己的任務插入到隊列之后闰渔,不會等待自己的任務結束,它會繼續(xù)把后面的任務插入到隊列铐望,然后等待自己的任務結束后才執(zhí)行后面任務冈涧。

barrier.png

圖例說明:在添加到隊列的任務1、任務2正蛙、任務3執(zhí)行完畢后督弓,然后才執(zhí)行barrier,barrier執(zhí)行完畢后才執(zhí)行任務4乒验、任務5

代碼如下:dispatch_barrier_async

- (void)concurrentQueueBarrier{
    //1 創(chuàng)建并發(fā)隊列
    dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
    
    //2 向隊列中添加任務
    dispatch_async(concurrentQueue, ^{
        NSLog(@"任務1,%@",[NSThread currentThread]);
    });
    dispatch_async(concurrentQueue, ^{
        NSLog(@"任務2,%@",[NSThread currentThread]);
    });
    dispatch_async(concurrentQueue, ^{
        NSLog(@"任務3,%@",[NSThread currentThread]);
    });
    dispatch_barrier_async(concurrentQueue, ^{
        [NSThread sleepForTimeInterval:1.0];
        NSLog(@"我是barrier");
    });
    NSLog(@"aa");

    dispatch_async(concurrentQueue, ^{
        NSLog(@"任務4,%@",[NSThread currentThread]);
    });
    NSLog(@"bb");
    dispatch_async(concurrentQueue, ^{
        NSLog(@"任務5,%@",[NSThread currentThread]);
    });
    
}

執(zhí)行結果:
任務3,<NSThread: 0x600000078640>{number = 5, name = (null)}
aa
任務1,<NSThread: 0x600000078600>{number = 3, name = (null)}
任務2,<NSThread: 0x60800007cd00>{number = 4, name = (null)}
bb
我是barrier
任務4,<NSThread: 0x60800007cd00>{number = 4, name = (null)}
任務5,<NSThread: 0x600000078600>{number = 3, name = (null)}

代碼如下:dispatch_barrier_sync

- (void)concurrentQueueBarrier{
    //1 創(chuàng)建并發(fā)隊列
    dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
    
    //2 向隊列中添加任務
    dispatch_async(concurrentQueue, ^{
        NSLog(@"任務1,%@",[NSThread currentThread]);
    });
    dispatch_async(concurrentQueue, ^{
        NSLog(@"任務2,%@",[NSThread currentThread]);
    });
    dispatch_async(concurrentQueue, ^{
        NSLog(@"任務3,%@",[NSThread currentThread]);
    });
    dispatch_barrier_sync(concurrentQueue, ^{
        [NSThread sleepForTimeInterval:1.0];
        NSLog(@"我是barrier");
    });
    NSLog(@"aa");

    dispatch_async(concurrentQueue, ^{
        NSLog(@"任務4,%@",[NSThread currentThread]);
    });
    NSLog(@"bb");
    dispatch_async(concurrentQueue, ^{
        NSLog(@"任務5,%@",[NSThread currentThread]);
    });
    
}

執(zhí)行結果:
任務3,<NSThread: 0x600000078640>{number = 5, name = (null)}

任務1,<NSThread: 0x600000078600>{number = 3, name = (null)}
任務2,<NSThread: 0x60800007cd00>{number = 4, name = (null)}

我是barrier
aa
bb
任務4,<NSThread: 0x60800007cd00>{number = 4, name = (null)}
任務5,<NSThread: 0x600000078600>{number = 3, name = (null)}

好了愚隧,說到這應該差不多能想通了,我們開始總結
dispatch_barrier_sync和dispatch_barrier_async的共同點:
1锻全、都會等待在它前面插入隊列的任務(1狂塘、2、3)先執(zhí)行完
2虱痕、都會等待他們自己的任務(0)執(zhí)行完再執(zhí)行后面的任務(4睹耐、5辐赞、6)

dispatch_barrier_sync和dispatch_barrier_async的不共同點:
在將任務插入到queue的時候部翘,dispatch_barrier_sync需要等待自己的任務(0)結束之后才會繼續(xù)程序,然后插入被寫在它后面的任務(4响委、5新思、6),然后執(zhí)行后面的任務
而dispatch_barrier_async將自己的任務(0)插入到queue之后赘风,不會等待自己的任務結束夹囚,它會繼續(xù)把后面的任務(4、5邀窃、6)插入到queue

所以荸哟,dispatch_barrier_async的不等待(異步)特性體現在將任務插入隊列的過程假哎,它的等待特性體現在任務真正執(zhí)行的過程

翻譯:

調用這個函數總是在barrier block被提交之后立即返回,不會等到block被執(zhí)行鞍历。當barrier block到并發(fā)隊列的最前端舵抹,他不會立即執(zhí)行。相反劣砍,隊列會等到所有當前正在執(zhí)行的blocks結束執(zhí)行惧蛹。到這時,barrier才開始自己執(zhí)行刑枝。所有在barrier block之后提交的blocks會等到barrier block結束之后才執(zhí)行香嗓。

這里指定的并發(fā)隊列應該是自己通過dispatch_queue_create函數創(chuàng)建的。如果你傳的是一個串行隊列或者全局并發(fā)隊列装畅,這個函數等同于dispatch_async函數靠娱。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市掠兄,隨后出現的幾起案子饱岸,更是在濱河造成了極大的恐慌,老刑警劉巖徽千,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件苫费,死亡現場離奇詭異,居然都是意外死亡双抽,警方通過查閱死者的電腦和手機百框,發(fā)現死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來牍汹,“玉大人铐维,你說我怎么就攤上這事∩鞣疲” “怎么了嫁蛇?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長露该。 經常有香客問我睬棚,道長,這世上最難降的妖魔是什么解幼? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任抑党,我火速辦了婚禮,結果婚禮上撵摆,老公的妹妹穿的比我還像新娘底靠。我一直安慰自己,他們只是感情好特铝,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布暑中。 她就那樣靜靜地躺著壹瘟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鳄逾。 梳的紋絲不亂的頭發(fā)上俐筋,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機與錄音严衬,去河邊找鬼澄者。 笑死,一個胖子當著我的面吹牛请琳,可吹牛的內容都是我干的粱挡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼俄精,長吁一口氣:“原來是場噩夢啊……” “哼询筏!你這毒婦竟也來了?” 一聲冷哼從身側響起竖慧,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嫌套,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后圾旨,有當地人在樹林里發(fā)現了一具尸體踱讨,經...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年砍的,在試婚紗的時候發(fā)現自己被綠了痹筛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡廓鞠,死狀恐怖帚稠,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情床佳,我是刑警寧澤滋早,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站砌们,受9級特大地震影響杆麸,放射性物質發(fā)生泄漏。R本人自食惡果不足惜怨绣,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一角溃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧篮撑,春花似錦、人聲如沸匆瓜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至茧妒,卻和暖如春萧吠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背桐筏。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工纸型, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人梅忌。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓狰腌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親牧氮。 傳聞我的和親對象是個殘疾皇子琼腔,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內容

  • 1. GCD簡介 什么是GCD呢?我們先來看看百度百科的解釋簡單了解下概念 引自百度百科:Grand Centra...
    千尋_544f閱讀 365評論 0 0
  • 背景 擔心了兩周的我終于輪到去醫(yī)院做胃鏡檢查了踱葛!去的時候我都想好了最壞的可能(胃癌)丹莲,之前在網上查的癥狀都很相似。...
    Dely閱讀 9,238評論 21 42
  • 文章目錄GCD簡介任務和隊列GCD的使用步驟隊列的創(chuàng)建方法任務的創(chuàng)建方法GCD的基本使用并行隊列 + 同步執(zhí)行并行...
    lusen_b閱讀 247評論 0 1
  • 一直想寫點東西尸诽,但是不知道寫什么甥材。直到看到自己買了一摞又一摞卻沒看多少的書的時候,我想我知道該寫什么了性含。 小時候愛...
    九月西閱讀 1,161評論 2 3
  • 標題:一條尋求生命意義的咸魚 副標題:當一條咸魚開始尋找活著的意義擂达,它還是一條咸魚嗎? 目錄 第一章 咸魚的自我定...
    野性優(yōu)格閱讀 605評論 3 3