dispatch_barrier_async

有啥用

在并行隊(duì)列中,為了保持某些任務(wù)的順序,需要等待一些任務(wù)完成后才能繼續(xù)進(jìn)行,使用 barrier 來(lái)等待之前任務(wù)完成,避免數(shù)據(jù)競(jìng)爭(zhēng)等問(wèn)題。
舉個(gè)栗子,老師說(shuō)原地解散,大家上個(gè)廁所,回來(lái)繼續(xù)排隊(duì)去公園,同學(xué)們飛奔向廁所,男孩紙因?yàn)楫吘箍煜±飮W啦很快回來(lái)了,女孩紙因?yàn)槟莻€(gè)原因(你懂得)比較慢還沒(méi)回來(lái),而老師要求是女孩紙排在前面,男孩子排在后面,這時(shí)候就需要一個(gè)"柵欄"保證排隊(duì)的順序不被打亂,男孩紙就等著女生回來(lái)再一起,排隊(duì),去公園,這個(gè)"柵欄"就是dispatch_barrier_async

實(shí)戰(zhàn)

dispatch_queue_t queue = dispatch_queue_create("will's thread", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_async(queue, ^{
        NSLog(@"----1-----%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"----2-----%@", [NSThread currentThread]);
    });
    
    dispatch_barrier_async(queue, ^{
        NSLog(@"----barrier-----%@", [NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"----3-----%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"----4-----%@", [NSThread currentThread]);
    });

dispatch_barrier_async作用是等待1、2兩個(gè)并行操作完成,才繼續(xù)后面3、4并行操作

image.png

如果你去掉dispatch_barrier_async,就全亂咯

- (void)barrier{//同dispatch_queue_create函數(shù)生成的concurrent Dispatch Queue隊(duì)列一起使用
    dispatch_queue_t queue = dispatch_queue_create("will's thread", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_async(queue, ^{
        NSLog(@"----1-----%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"----2-----%@", [NSThread currentThread]);
    });
    
//    dispatch_barrier_async(queue, ^{
//        NSLog(@"----barrier-----%@", [NSThread currentThread]);
//    });
    
    dispatch_async(queue, ^{
        NSLog(@"----3-----%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"----4-----%@", [NSThread currentThread]);
    });
}
image.png

注意點(diǎn)

使用 dispatch_barrier_async ,該函數(shù)只能搭配自定義并行隊(duì)列 dispatch_queue_t 使用。不能使用: dispatch_get_global_queue ,否則 dispatch_barrier_async 的作用會(huì)和 dispatch_async 的作用一模一樣。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在訪問(wèn)數(shù)據(jù)庫(kù)或者文件的時(shí)候,我們可以使用Serial Dispatch Queue可避免數(shù)據(jù)競(jìng)爭(zhēng)問(wèn)題,代碼如下所示...
    魏雷123閱讀 379評(píng)論 0 0
  • 需求:有4個(gè)任務(wù){(diào)1,2,3,4},執(zhí)行完前2個(gè)再執(zhí)行后2個(gè) 這里我們用到柵欄函數(shù)dispatch_barrier...
    紅成魔閱讀 21,479評(píng)論 9 18
  • 作用 實(shí)現(xiàn)高效率的數(shù)據(jù)庫(kù)訪問(wèn)和文件訪問(wèn) 避免數(shù)據(jù)競(jìng)爭(zhēng) 前提條件 必須使用dispatch_queue_create...
    神的旨意閱讀 427評(píng)論 0 1
  • 學(xué)多線程時(shí),不注意總結(jié)老是學(xué)學(xué)忘忘,今天特地總結(jié)下。只為總結(jié)留作資料,參考了許多博客內(nèi)容,如有博主不爽請(qǐng)留言,立馬...
    thinkq閱讀 294評(píng)論 0 1
  • 好幾年沒(méi)見(jiàn)你,不知道你消息。夜里的風(fēng)雨,請(qǐng)你不用太急,給我這個(gè)夜歸人,沒(méi)帶傘的靈魂,一點(diǎn)點(diǎn)僥幸。
    婷兒小魚(yú)閱讀 182評(píng)論 4 2

友情鏈接更多精彩內(nèi)容