并發(fā)編程

文章目錄:

一、圖示理解

二、各個(gè)角色

三、存在的挑戰(zhàn)


一、圖示理解


二、各個(gè)角色

1.程序員(創(chuàng)建任務(wù))

代碼就是任務(wù)

當(dāng)一些任務(wù)需要在一條新線程而非當(dāng)前線程執(zhí)行時(shí)若程序員直接創(chuàng)建線程可能會(huì)引發(fā)的一個(gè)問題是,如果你的任務(wù)和所基于的框架任務(wù)都創(chuàng)建自己的線程時(shí),那么活動(dòng)的線程數(shù)量有可能以指數(shù)級(jí)增長(zhǎng)。這會(huì)消耗大量資源,是不允許的

解決方案:使用GCD&operation queue

通過 GCD,開發(fā)者不用再直接跟線程打交道了,只需要向隊(duì)列中添加代碼塊即可,GCD 在后端管理著一個(gè)線程池。GCD 不僅決定著你的代碼塊將在哪個(gè)線程被執(zhí)行,它還根據(jù)可用的系統(tǒng)資源對(duì)這些線程進(jìn)行管理。

2.GCD&operation queue(管理任務(wù),安排任務(wù))

以GCD為例:

程序員所需要做的就是按照GCD的規(guī)則(串行并行,同步異步)創(chuàng)建添加任務(wù)

可以將串行并行,同步異步理解為任務(wù)的屬性

通過指定任務(wù)的串行并行,GCD判斷如何分配任務(wù)即分配任務(wù)給哪個(gè)線程

通過指定任務(wù)的同步異步,GCD告訴將要執(zhí)行該任務(wù)的線程如何處理新任務(wù)與其當(dāng)前任務(wù)的關(guān)系

3.線程(執(zhí)行任務(wù))

執(zhí)行任務(wù)的人(干活的)

4.RunLoop(為線程監(jiān)測(cè)事件,事件發(fā)生時(shí)告訴線程執(zhí)行事件觸發(fā)的任務(wù))

Runloop負(fù)責(zé)監(jiān)測(cè)處理 UI 事件、計(jì)時(shí)器,以及其它內(nèi)核相關(guān)事件。

無論開發(fā)者什么時(shí)候設(shè)置計(jì)時(shí)器、使用NSURLConnection或者調(diào)用performSelector:withObject:afterDelay:,其實(shí)背后都是 run loop 在處理這些異步事件。

5.資源(線程執(zhí)行任務(wù)所需,如內(nèi)存等)

6.Autoreleasepool(為線程清理執(zhí)行任務(wù)后產(chǎn)生的垃圾)

Autoreleasepool工作原理:?

RunLoop在線程執(zhí)行完一次任務(wù)后銷毀當(dāng)前Autoreleasepool同時(shí)為線程創(chuàng)建一個(gè)新的Autoreleasepool以便線程下一次執(zhí)行任務(wù)使用

Autoreleasepool被銷毀會(huì)引起Autoreleasepool中所有的對(duì)象release從而釋放內(nèi)存

三、存在的挑戰(zhàn)

資源共享,互斥鎖,死鎖,資源饑餓,優(yōu)先級(jí)反轉(zhuǎn)

操作隊(duì)列提供了在 GCD 中不那么容易復(fù)制的有用特性。其中最重要的一個(gè)就是可以取消在任務(wù)處理隊(duì)列中的任務(wù),在稍后的例子中我們會(huì)看到這個(gè)。而且操作隊(duì)列在管理操作間的依賴關(guān)系方面也容易一些。另一面,GCD 給予你更多的控制權(quán)力以及操作隊(duì)列中所不能使用的底層函數(shù)。

最后編輯于
?著作權(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)容

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