判斷是否死鎖 終極方法是判斷
死鎖問題產(chǎn)生的根源是dispatch_sync 是否是發(fā)生在當前dispatch_sync代碼上下文是否是同一個線程
也就是dispatch_sync 阻塞的是否是dispatch_sync代碼上下文所在的線程
比如當前我代碼執(zhí)行所在的是A線程,然后我做同步A現(xiàn)成操作 必定會死鎖
但是如果我在A線程中 做同步B線程操作是不會造成死鎖的
第一種情況
首先任務1 實在主線程中執(zhí)行的 我同步操作 dispatch_get_main_quene()獲取到的是一個主隊列,主隊列有個特性就是 一定會執(zhí)行在主線程中,這樣我阻塞的就是主線程。這樣就死鎖了胡陪。
第二種情況 首先有個概念 dispatch_get_global_quene 或者是 dispatch_quene_create來創(chuàng)建的隊列 都是有特定的線程去做執(zhí)行操作
也就是說肯定不是在主線程中執(zhí)行的
再分析一下上面的代碼,任務1是在主線程中執(zhí)行的。任務3也是主線程往声。但是任務2在一個獨立的線程去執(zhí)行,也就是阻塞的是一個分支線程戳吝,這樣就不會產(chǎn)生阻塞浩销。
再來分析一下 上面這種情況 async是不會產(chǎn)生死鎖的。然后1 跟 5是可以正常輸出的听哭。不過由于是異步的 所以2跟5的輸出順序是不一定的慢洋。注意:假設(shè)quene所在的線程是A塘雳,任務3處 做的同步操作 就是阻塞的線程A,這樣就死鎖了普筹。
這種情況 也是同樣的邏輯思路
任務1是在主線程中執(zhí)行的败明,1 跟 5是可以正常執(zhí)行的。2也可以正常輸出太防。由于在任務2處是在一個獨立的線程妻顶,這時候再去同步住隊列所在的主線程,這樣不會出現(xiàn)問題 因為同步操作內(nèi)的block跟 同步操作所在的上下文是不在同一個線程中的