并發(fā)編程

文章目錄:

一、圖示理解

二、各個角色

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


一、圖示理解


二、各個角色

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

代碼就是任務

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

解決方案:使用GCD&operation queue

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

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

以GCD為例:

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

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

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

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

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

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

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

Runloop負責監(jiān)測處理 UI 事件、計時器,以及其它內(nèi)核相關(guān)事件。

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

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

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

Autoreleasepool工作原理:?

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

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

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

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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