iOS GCD(五) 死鎖案例分析

iOS GCD (一) 任務+隊列 基礎組合
iOS GCD (二 ) dispatch_group 隊列組
iOS GCD(三) dispatch_barrier_async 柵欄方法
iOS GCD (四) dispatch_semaphore 信號量
iOS GCD(五) 死鎖案例分析
iOS GCD(六)線程加鎖

死鎖一:

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"1========%@",[NSThread currentThread]);
    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"2========%@",[NSThread currentThread]);
    });
    NSLog(@"3========%@",[NSThread currentThread]);
}
2018-04-25 22:39:46.674860+0700 GCDCC[39201:2495255] 1========<NSThread: 0x604000071d00>{number = 1, name = main}
(lldb) 

分析:
我們先做一個定義:- (void)viewDidLoad{} ---> 任務A,GCD同步函數(shù) --->任務B。

總而言之呢,大概是這樣的,首先,任務A在主隊列,并且已經(jīng)開始執(zhí)行,在主線程打印出1===... ...,然后這時任務B被加入到主隊列中,并且同步執(zhí)行,這尼瑪事都大了,系統(tǒng)說,同步執(zhí)行啊,那我不開新的線程了,任務B說我要等我里面的Block函數(shù)執(zhí)行完成,要不我就不返回,但是主隊列說了,玩蛋去,我是串行的,你得等A執(zhí)行完才能輪到你,不能壞了規(guī)矩,同時,任務B作為任務A的內部函數(shù),必須等任務B執(zhí)行完函數(shù)返回才能執(zhí)行下一個任務。那就造成了,任務A等待任務B完成才能繼續(xù)執(zhí)行,但作為串行隊列的主隊列又不能讓任務B在任務A未完成之前開始執(zhí)行,所以任務A等著任務B完成,任務B等著任務A完成,等待,永久的等待。所以就死鎖了。簡單不?下面我們慎重看一下我們無意識書寫的代碼!

死鎖二:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    dispatch_queue_t q = dispatch_queue_create("chuan", DISPATCH_QUEUE_SERIAL);
    dispatch_sync(q, ^{
        NSLog(@"1========%@",[NSThread currentThread]);
        dispatch_sync(q, ^{
            NSLog(@"2========%@",[NSThread currentThread]);
        });
        dispatch_async(q, ^{
            NSLog(@"3========%@",[NSThread currentThread]);
        });
    });
}
2018-04-26 09:57:42.324541+0700 GCD[75126:3811592] 1========<NSThread: 0x600000073580>{number = 1, name = main}
(lldb)

分析:
首先隊列是一個串行隊列,串行隊列的特點,一個任務執(zhí)行完畢執(zhí)行下一個任務,開不線程取決于任務是同步還是異步,開幾條線程決定于世串行還是并行,此時的情況說明 任務1,任務2,任務3全部都在同一條線程上執(zhí)行,并且線程是同步執(zhí)行的,講到這里我想你已經(jīng)懂了,比如說任務A正在執(zhí)行任務,遇到了任務B,任務A我必須要執(zhí)行完我的任務任務B你讓開道,任務B是個死腦筋,會說我們兩個在同一條道上,我的原則和你的原則一樣,你不執(zhí)行完,休想讓我執(zhí)行,這個時候任務A和任務B就開始了漫長的相互等待導致最后的崩潰。

這個和案例一一樣只是可以再一次深入理解一下

死鎖三

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    dispatch_queue_t q = dispatch_queue_create("chuan", DISPATCH_QUEUE_SERIAL);
    dispatch_async(q, ^{
        NSLog(@"1========%@",[NSThread currentThread]);
        dispatch_sync(q, ^{
            NSLog(@"2========%@",[NSThread currentThread]);
        });
        dispatch_async(q, ^{
            NSLog(@"3========%@",[NSThread currentThread]);
        });
    });
}
2018-04-26 10:14:19.802281+0700 GCD[75370:3825211] 1========<NSThread: 0x604000274b80>{number = 3, name = (null)}
(lldb) 

分析:
這個案例和案例一,案例二一樣,屬于同一個案例,只是不同的形式,看到這里是不是有種666的感覺~
首先 我們還是從隊列開始分析,這是一個串行隊列,串行隊列的特點是一個任務執(zhí)行完執(zhí)行下一個任務,道理同案例一案例二,不解釋了 兄弟們,希望幫到你們~

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

相關閱讀更多精彩內容

  • 1.ios高性能編程 (1).內層 最小的內層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結構(3).初始化時...
    歐辰_OSR閱讀 30,217評論 8 265
  • 從哪說起呢? 單純講多線程編程真的不知道從哪下嘴。。 不如我直接引用一個最簡單的問題,以這個作為切入點好了 在ma...
    Mr_Baymax閱讀 2,909評論 1 17
  • 我感受著身邊所有的崛地而起, 還有日漸崩塌的腐朽構造。 我聽得見它們的歡呼或者悲嚎, 還有一些窸窸窣窣的聲音, 從...
    林沐夏閱讀 477評論 1 3
  • 有個卵用?。。?王者榮耀的排位賽里,選人準備階段,總會有人發(fā)出戰(zhàn)績(某英雄使用2000次,勝率55%),好像顯得自...
    禪心如水閱讀 677評論 1 2
  • 在工作中,我痛恨拖沓。拖沓會讓一個團隊喪失緊張感和節(jié)奏感,像慢性毒藥一樣侵入組織肌體。 聶校長曾經(jīng)發(fā)過一個微信,我...
    魏智淵閱讀 4,827評論 2 11

友情鏈接更多精彩內容