[OC] 多線程易混淆概念集合(死鎖詳解)

Q&A 你需要知道的
1.進程與線程

1.進程

  • 進程是指在系統(tǒng)中正在運行的一個應(yīng)用程序(同時打開Chrome和QQ,系統(tǒng)會分別啟動2個進程)
  • 每個進程之間是獨立的,每個進程均運行在其專用且受保護的內(nèi)存空間內(nèi)

2.線程

  • 一個進程想要執(zhí)行任務(wù),必須得有線程(每個進程至少要有一條線程,即主線程)
  • -線程是進程的基本執(zhí)行單元,進程的所有任務(wù)都在線程中執(zhí)行
2.任務(wù)與隊列
  • 任務(wù):執(zhí)行什么操作
  • 隊列:用來存放任務(wù)
  • 任務(wù)在隊列中遵循FIFO原則:先進先出,后進后出
任務(wù)與隊列
3.同步與異步
  • 同步:在當(dāng)前線程中執(zhí)行任務(wù),不具備開啟新線程的能力
    --執(zhí)行特點:會等待任務(wù)執(zhí)行完成后,再調(diào)度后續(xù)的任務(wù)
  • 異步:在新的線程中執(zhí)行任務(wù),具備開啟新線程的能力
    --執(zhí)行特點:同時底層線程池有可用的線程資源,會再新的線程調(diào)度后續(xù)任務(wù)的執(zhí)行
4.串行與并發(fā)
  • 串行(隊列):一個任務(wù)執(zhí)行完畢后,再執(zhí)行下一個任務(wù)
  • 并發(fā)(隊列):多個任務(wù)并發(fā)(同時)執(zhí)行
5.主隊列
  • 不開線程,同步執(zhí)行
  • 主隊列特點:如果主線程正在執(zhí)行代碼,此時不調(diào)度任務(wù),等主線程執(zhí)行結(jié)束后在執(zhí)行任務(wù)
  • 主隊列又叫:全局串行隊列
四種隊列的比較
6.死鎖產(chǎn)生的原因
  • 主隊列:如果主線程正在執(zhí)行代碼,就不調(diào)度任務(wù)
  • 同步執(zhí)行:如果第一個任務(wù)沒有執(zhí)行,就繼續(xù)等待第一個任務(wù)執(zhí)行完成,再執(zhí)行下一個任務(wù)此時互相等待,程序無法往下執(zhí)行(死鎖)
主線程隊列是串行隊列,隊列中的任務(wù)是一個執(zhí)行完成后才去執(zhí)行另一個,用同步方法將任務(wù)1提交到主線程隊列就會阻塞住主線程,而這個剛提交到任務(wù)1必須等主線程中的其它任務(wù)執(zhí)行完成后才能執(zhí)行,但是這時主線程已經(jīng)被阻塞了,就是說要等任務(wù)1執(zhí)行完后才能去執(zhí)行原有的任務(wù),所以雙方在互相請求資源而得不到,最后一個任務(wù)也沒機會執(zhí)行到,就造成了死鎖.
PS:為什么主線程是串行隊列,而串行隊列同步執(zhí)行不會死鎖
  • 因為主線程是特殊的串行隊列,他執(zhí)行任務(wù)的特點并不同與常規(guī)的串行隊列。
  • 1.常規(guī)的串行隊列同步執(zhí)行是串行隊列一個接一個地放到主線程上執(zhí)行,執(zhí)行完一個以后,再調(diào)用下一個,并不會阻塞主隊列。
  • 2.主線程串行同步的情況:主線程開始執(zhí)行任務(wù)的時候,要把它得到的任務(wù)提交到主隊列的末尾,此時主隊列要等主線程空閑的時候才會把任務(wù)放到主線程上,然后再取任務(wù)。主線程等主隊列取任務(wù),主隊列等主線程空閑,形成死鎖。
思考:這里為什么會死鎖?
dispatch_queue_t queue = dispatch_queue_create("abc", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{         
    dispatch_sync(queue, ^{    //這行同步會死鎖
        NSLog(@"1");
    });
});
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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