GCD 死鎖案例分析

案例一:主隊列,同步線程
  NSLog(@"dispatch_queue_1");//任務(wù)一

    dispatch_sync(dispatch_get_main_queue(), ^{
    });

    NSLog(@"dispatch_queue_3");// 任務(wù)三

// 輸出: dispatch_queue_1
  • 任務(wù)1執(zhí)行后弟塞,同步線程任務(wù)2加到主隊列中凭峡,任務(wù)3會等待任務(wù)2執(zhí)行完成后執(zhí)行
  • 對于隊列,有任務(wù)來决记,會將任務(wù)加到隊尾,然后遵循FIFO原則執(zhí)行任務(wù)倍踪,任務(wù)2會被添加到隊列的隊尾系宫,在任務(wù)3的后面,會等待任務(wù)3執(zhí)行完畢后執(zhí)行
  • 綜上任務(wù)2等待3的執(zhí)行建车,同時任務(wù)3等到任務(wù)2的執(zhí)行扩借,從而造成了死鎖
案例二:主隊列,異步線程
NSLog(@"dispatch_queue_1");//任務(wù)1
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"dispatch_queue_2");// 任務(wù)二
    });
    NSLog(@"dispatch_queue_3");// 任務(wù)三

// 輸出:
dispatch_queue_1
dispatch_queue_3
dispatch_queue_2
  • 任務(wù)1執(zhí)行后缤至,異步線程任務(wù)2加到主隊列中潮罪,任務(wù)3不會等待任務(wù)2執(zhí)行完成后執(zhí)行
  • 對于隊列,有任務(wù)來领斥,會將任務(wù)加到隊尾嫉到,然后遵循FIFO原則執(zhí)行任務(wù),任務(wù)2會被添加到隊列的隊尾月洛,在任務(wù)3的后面何恶,會等待任務(wù)3執(zhí)行完畢后執(zhí)行
  • 綜上任務(wù)2等待3的執(zhí)行,任務(wù)3不會等到任務(wù)2的執(zhí)行嚼黔,從而不會造成死鎖细层,任務(wù)執(zhí)行順序是 1 3 2.
案例三:全局隊列,同步線程
NSLog(@"dispatch_queue_1");//任務(wù)1
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
          NSLog(@"dispatch_queue_2");//任務(wù)2
     });
     NSLog(@"dispatch_queue_3");// 任務(wù)3

// 輸出:
dispatch_queue_1
dispatch_queue_2
dispatch_queue_3
  • 任務(wù)1執(zhí)行后唬涧,同步線程任務(wù)2加到全局對列(Global Queue)中疫赎,任務(wù)3會等待任務(wù)2執(zhí)行完成后執(zhí)行
  • 對于任務(wù)2,因為實在全局隊列(Global Queue)中碎节,它的執(zhí)行不受主隊列任務(wù)的影響捧搞,所以任務(wù)2在全局隊列執(zhí)行完畢之后會返回到主隊列執(zhí)行任務(wù)3
  • 綜上任務(wù)3等待全局隊列中的同步任務(wù)2的執(zhí)行,任務(wù)2的執(zhí)行不會阻塞钓株,從而不會造成死鎖实牡,任務(wù)執(zhí)行順序是 1 2 3.
案例四:全局隊列,異步線程
NSLog(@"dispatch_queue_1");//任務(wù)1
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
          NSLog(@"dispatch_queue_2");//任務(wù)2
     });
     NSLog(@"dispatch_queue_3");// 任務(wù)3

// 輸出:
dispatch_queue_1
dispatch_queue_2
dispatch_queue_3
or 
dispatch_queue_1
dispatch_queue_3
dispatch_queue_2
  • 任務(wù)1執(zhí)行后轴合,異步線程任務(wù)2加到全局對列(Global Queue)中创坞,任務(wù)3不會等待任務(wù)2執(zhí)行完成后執(zhí)行
  • 對于任務(wù)2,因為實在全局隊列(Global Queue)中受葛,它的執(zhí)行不受主隊列任務(wù)的影響
  • 綜上任務(wù)3不會等待全局隊列中的異步任務(wù)2的執(zhí)行题涨,任務(wù)2的執(zhí)行不會阻塞偎谁,從而不會造成死鎖,任務(wù)執(zhí)行順序是 1 2 3 or 1 3 2.
案例五:串行隊列纲堵,異步巡雨、同步線程
dispatch_queue_t queue = dispatch_queue_create("com.gcd.serialqueue", DISPATCH_QUEUE_SERIAL);
     NSLog(@"dispatch_queue_1");//任務(wù)1    
_async(queue, ^{
        NSLog(@"dispatch_queue_2");//任務(wù)2
        dispatch_sync(queue, ^{
            NSLog(@"dispatch_queue_3");//任務(wù)3
        });
        NSLog(@"dispatch_queue_4");//任務(wù)4
    });
    NSLog(@"dispatch_queue_5");//任務(wù)5
  • 任務(wù)1執(zhí)行完成之后席函,將異步線程任務(wù)2铐望,同步隊列和任務(wù)4加入到串行隊列,任務(wù)5不需要等待任務(wù)2茂附,所以任務(wù)2和任務(wù)5的執(zhí)行順序不一定正蛙。
  • 任務(wù)2執(zhí)行完成后,同步線程的任務(wù)3加入到串行隊列营曼,任務(wù)4的執(zhí)行等待任務(wù)3的執(zhí)行完成
  • 對于隊列乒验,有任務(wù)來,會將任務(wù)加到隊尾蒂阱,然后遵循FIFO原則執(zhí)行任務(wù)锻全,任務(wù)3會被添加到隊列的隊尾,在任務(wù)4的后面录煤,會等待任務(wù)4執(zhí)行完畢后執(zhí)行
  • 綜上所述鳄厌,任務(wù)3和任務(wù)4陷入無限的等待中,造成死鎖
案例六:異步線程辐赞、全局隊列部翘,同步線程,主隊列
/*
     1:加入到Main Queue中的有 任務(wù)1响委,異步線程新思、全局隊列,任務(wù)5
     2:加入到 Global Queue中的有 任務(wù)2赘风,同步線程夹囚,主隊列,任務(wù)4
     */
    NSLog(@"dispatch_queue_1");//任務(wù)1
    
    //  執(zhí)行完任務(wù)1后邀窃,將異步線程的任務(wù)2加到Global Queue中荸哟,所以任務(wù)5不用等待,結(jié)果就是2和5的輸出順序不一定
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"dispatch_queue_2");//任務(wù)2
        // 執(zhí)行完任務(wù)2瞬捕,將同步線程的任務(wù)添加到主隊列中鞍历,這時任務(wù)3在任務(wù)5后面。
        dispatch_sync(dispatch_get_main_queue(), ^{
            NSLog(@"dispatch_queue_3");//任務(wù)3
        });
        // 未發(fā)生阻塞肪虎,執(zhí)行任務(wù)4
        NSLog(@"dispatch_queue_4");//任務(wù)4
    });
     NSLog(@"dispatch_queue_5");//任務(wù)5
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末劣砍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子扇救,更是在濱河造成了極大的恐慌刑枝,老刑警劉巖香嗓,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異装畅,居然都是意外死亡靠娱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門掠兄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來像云,“玉大人,你說我怎么就攤上這事蚂夕∩环眩” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵双抽,是天一觀的道長。 經(jīng)常有香客問我闲礼,道長牍汹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任柬泽,我火速辦了婚禮慎菲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘锨并。我一直安慰自己露该,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布第煮。 她就那樣靜靜地躺著解幼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪包警。 梳的紋絲不亂的頭發(fā)上撵摆,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機(jī)與錄音害晦,去河邊找鬼特铝。 笑死,一個胖子當(dāng)著我的面吹牛壹瘟,可吹牛的內(nèi)容都是我干的鲫剿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼稻轨,長吁一口氣:“原來是場噩夢啊……” “哼灵莲!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起澄者,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤笆呆,失蹤者是張志新(化名)和其女友劉穎请琳,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赠幕,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡俄精,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了榕堰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片竖慧。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖逆屡,靈堂內(nèi)的尸體忽然破棺而出圾旨,到底是詐尸還是另有隱情,我是刑警寧澤魏蔗,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布砍的,位于F島的核電站,受9級特大地震影響莺治,放射性物質(zhì)發(fā)生泄漏廓鞠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一谣旁、第九天 我趴在偏房一處隱蔽的房頂上張望床佳。 院中可真熱鬧,春花似錦榄审、人聲如沸砌们。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浪感。三九已至,卻和暖如春拷获,著一層夾襖步出監(jiān)牢的瞬間篮撑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工匆瓜, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留赢笨,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓驮吱,卻偏偏與公主長得像茧妒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子左冬,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容