iOS-多線程-死鎖

所謂死鎖,是指兩個(gè)或兩個(gè)以上的線程在執(zhí)行過程中,因爭(zhēng)奪資源(數(shù)據(jù)源、內(nèi)存等,變量不是資源)而造成的一種相互等待的現(xiàn)象,若無外部處理作用,它們都將無限等待下去。

四個(gè)必備條件:

  • 互斥:所謂互斥就是線程在某一時(shí)間內(nèi)獨(dú)占資源。如果此時(shí)還有其它進(jìn)程請(qǐng)求資源,則請(qǐng)求者只能等待,直至占有資源的進(jìn)程用畢釋放。
  • 請(qǐng)求與保持:指線程已經(jīng)保持至少一個(gè)資源,但又提出了新的資源請(qǐng)求,而該資源已被其它進(jìn)程占有,此時(shí)請(qǐng)求進(jìn)程阻塞,但又對(duì)自己已獲得的其它資源保持不放。
  • 不剝奪:指線程已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完時(shí)由自己釋放。
  • 環(huán)路等待:指在發(fā)生死鎖時(shí),必然存在一個(gè)線程——資源的環(huán)形鏈。

開發(fā)中碰到的死鎖:

  1. 在GCD中,主要的死鎖就是當(dāng)前串行隊(duì)列里面同步執(zhí)行當(dāng)前串行隊(duì)列。解決的方法就是將同步的串行隊(duì)列放到另外一個(gè)線程執(zhí)行。
  2. 兩個(gè)串行隊(duì)列A、B,其中A是B的目標(biāo)隊(duì)列,這樣隊(duì)列之間會(huì)形成層級(jí)體系,B中的任務(wù)稍候都會(huì)在A中一次執(zhí)行,于是排在AB中的任務(wù)都是在A中串行執(zhí)行,這時(shí)如果在隊(duì)列B中的塊中,判斷當(dāng)前隊(duì)列不是A那么就認(rèn)為可以在隊(duì)列A上執(zhí)行同步派發(fā)操作,實(shí)際上會(huì)導(dǎo)致死鎖。
    解決方案:隊(duì)列特有數(shù)據(jù)。
  3. 互斥鎖在已獲得鎖的情況下再次請(qǐng)求鎖,線程會(huì)因?yàn)榈却i的釋放而進(jìn)入睡眠狀態(tài),因此就不可能再釋放鎖,從而導(dǎo)致死鎖。
最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 從哪說起呢? 單純講多線程編程真的不知道從哪下嘴。。 不如我直接引用一個(gè)最簡(jiǎn)單的問題,以這個(gè)作為切入點(diǎn)好了 在ma...
    Mr_Baymax閱讀 2,903評(píng)論 1 17
  • 基礎(chǔ)知識(shí): 下面是五道面試題,寫出打印結(jié)果(題目從別人那盜的,但是作者寫的看不明白,用自己語(yǔ)言總結(jié)一下) 第一題:...
    LaurenceZi閱讀 889評(píng)論 1 15
  • 前言 iOS開發(fā)中由于各種第三方庫(kù)的高度封裝,對(duì)鎖的使用很少,剛好之前面試中被問到的關(guān)于并發(fā)編程鎖的問題,都是一知...
    喵渣渣閱讀 3,861評(píng)論 0 33
  • Java-Review-Note——4.多線程 標(biāo)簽: JavaStudy PS:本來是分開三篇的,后來想想還是整...
    coder_pig閱讀 1,761評(píng)論 2 17
  • Object C中創(chuàng)建線程的方法是什么?如果在主線程中執(zhí)行代碼,方法是什么?如果想延時(shí)執(zhí)行代碼、方法又是什么? 1...
    AlanGe閱讀 1,908評(píng)論 0 17

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