GCD多線程

GCD優(yōu)點:

1.GCD 本身自帶有線程鎖的效果,能通過推遲昂貴計算任務(wù)并在后臺運行它們來改善應(yīng)用的響應(yīng)性能。

2.GCD 提供了更易于使用的并發(fā)模型(效果方面類似于對鎖和線程進行封包,程序員使用的過程中本身可以不直接接觸鎖和線程)避開并發(fā)陷阱(鎖和線程的相關(guān)陷阱)。

3.GCD 具有在常見模式(如單例,mvc)上采用更高性能的原語(封包后只需要考慮出入接口問題)優(yōu)化代碼的能力。

函數(shù)指令與相應(yīng)的任務(wù):

函數(shù)指令是一系列的代碼指令的集合,可以為計算機平臺識別的指令的集合。

計算機的相關(guān)平臺在接收到函數(shù)指令之后,平臺將會作出一系列的應(yīng)對措施既執(zhí)行一系列的應(yīng)對操作行為(任務(wù))。從本質(zhì)方面而言,指令為因任務(wù)為果。

Serial vs. Concurrent 串行 vs. 并發(fā)

共同點:描述當(dāng)前任務(wù)相對于其它任務(wù)被執(zhí)行狀態(tài)。(都強調(diào)任務(wù))

差異:串行是逐個逐個,每次有且僅有一個任務(wù)被執(zhí)行。并發(fā)是在同一時間可以有多個任務(wù)被執(zhí)行。

Synchronous vs. Asynchronous 同步 vs. 異步

共同點:描述當(dāng)前的函數(shù)指令相對于其相應(yīng)任務(wù)(指令函數(shù)要求 GCD 執(zhí)行的任務(wù))的狀態(tài)。同步函數(shù)可以視為異步函數(shù)的一種特殊情況。同步異步研究的內(nèi)容是函數(shù)指令與其相應(yīng)任務(wù)間的關(guān)系(同一個當(dāng)前線程下的研究)。

差異:

同步:只在指令函數(shù)預(yù)定的任務(wù)已經(jīng)完成后,計算機才返回指令函數(shù)入口(出口)處,進入下一個指令重復(fù)。同步條件下任務(wù)只能逐個執(zhí)行,故同步必串行,同步并發(fā)無意義。

異步:無論預(yù)定的任務(wù)當(dāng)前是否已經(jīng)完成,計算機都會由當(dāng)前立即返回指令函數(shù)入口(出口)處,進入下一個指令重復(fù)。也就是說預(yù)定的任務(wù)最終肯定會完成但計算機不會等著它完成而是立即返回指令函數(shù)入口(出口)處。異步函數(shù)(指令)不會阻塞當(dāng)前線程去執(zhí)行下一個函數(shù)(指令),同步函數(shù)(指令)會阻塞當(dāng)前線程去執(zhí)行下一個函數(shù)(指令)。

同步函數(shù)為當(dāng)前線程下的阻塞函數(shù)。

Critical Section 臨界區(qū)

同一段代碼不能被多個線程并發(fā)執(zhí)行,也就是,多個線程不能同時執(zhí)行某段代碼。因為代碼去操作一個共享資源,例如一個共享變量資源若共享的變量資源被多個進程/線程并發(fā)訪問,那么它很可能會變質(zhì)(它的值不再可信)。

Race Condition 競態(tài)條件

基于特定序列或時機的事件的軟件系統(tǒng)以不受控制的方式運行的行為。如程序的并發(fā)任務(wù)執(zhí)行的確切順序即為一種靜態(tài)條件。競態(tài)條件可導(dǎo)致無法預(yù)測的行為,而不能通過代碼檢查立即發(fā)現(xiàn)。

Deadlock 死鎖

第一個線程指令的執(zhí)行以第二個線程指令的完成作為前提同時第二個線程指令的執(zhí)行又以第一個線程指令的完成作為前提;兩個線程指令互相等待著對方先完成,兩個線程指令都處于互相等待的狀態(tài),結(jié)果導(dǎo)致彼此都未能夠執(zhí)行,兩個線程指令處于相互卡死狀態(tài)(死鎖)。故死鎖狀態(tài)下程序不在執(zhí)行下去。

Thread Safe 線程安全

具有線程安全性的代碼能在多線程或并發(fā)任務(wù)中被安全的調(diào)用,而不會導(dǎo)致數(shù)據(jù)損壞,崩潰等問題。線程不安全的代碼在某一個/同一個時刻只能在一個線程上下文中運行。 NSDictionary代碼是線程安全代碼,所以在同一時間在多個線程中使用它而不會有問題。NSMutableDictionary代碼屬于線程非安全代碼,同一時刻只能有一個線程訪問代碼。

Context Switch (線程之間)上下文切換(額外的開銷)

(線程之間)上下文切換指當(dāng)你在單個進程里對不同的線程進行切換執(zhí)行期間(由一個線程切換為另一個線程期間)存儲與恢復(fù)執(zhí)行狀態(tài)的過程。

Concurrency vs Parallelism 單核并發(fā)與多核并行

單核cpu處理器下,并發(fā)代碼的各個部分采用搶占cpu資源的方式在納米級時間段內(nèi)進行線程間并發(fā)代碼的切換,此時線程間的并發(fā)代碼是否發(fā)生或怎樣的順序發(fā)生無法確定。

對于多核cpu設(shè)備而言,多個線程上的代碼以并行方式運行,既每一個線程都可以單獨獲取一個獨立的cpu獨立運行,不需要不斷的相互切換線程。若為了使單核cpu設(shè)備也能實現(xiàn)并行,必須先運行一個線程,執(zhí)行一個線程上下文切換,上下文切換之后再運行另一個線程或進程。

并行可以視為并發(fā)的特殊情況,并行要求并發(fā),但并發(fā)并不能保證并行。并發(fā)為必要不充分的代碼構(gòu)造條件。

Queues 隊列(FIFO)

GCD可用dispatch queues處理任務(wù)代碼塊block,調(diào)度隊列管理著提供給GCD的代碼塊block任務(wù)并才用 FIFO隊列順序執(zhí)行這些block任務(wù)。第一個被添加到隊列里的任務(wù)會是隊列中第一個開始的任務(wù),而第二個被添加的任務(wù)將第二個開始,如此直到隊列的終點。(調(diào)度隊列本身屬于一種管理代碼(管理代碼也是代碼)且為線程安全代碼可從多個線程并行的訪問。)

Serial Queues 調(diào)度串行隊列還是Concurrent Queues 調(diào)度并發(fā)隊列都遵循FIFO先進先出先執(zhí)行,后進后出后執(zhí)行的原則,區(qū)別在于怎樣的狀態(tài)下的后執(zhí)行。

調(diào)度串行隊列中一次只能夠執(zhí)行一個任務(wù),既后一個模塊任務(wù)被執(zhí)行的前提條件必須為前一個模塊任務(wù)已經(jīng)完成且前一個Block任務(wù)結(jié)束時間點和后一個模塊任務(wù)開始時間點之間的過渡時間段長度不確定(受到 GCD 的控制)。調(diào)度串行隊列中每一個模塊任務(wù)的執(zhí)行時機受到 GCD 的控制進而不可確定;唯一能確保的事情是 在調(diào)度串行隊列GCD一次只執(zhí)行一個任務(wù),并且按照FIFO順序來執(zhí)行。

在GCD環(huán)境下,需要新增的子線程(數(shù)目)不需要程序員本身親自生成而是由系統(tǒng)后臺按需要自動生成并分配。由于GCD串行隊列中同一時間只會執(zhí)行一個模塊任務(wù)也就只會生成一個子線程(一個子線程執(zhí)行一個代碼模塊任務(wù)),不會出現(xiàn)同時訪問臨界區(qū)的風(fēng)險;如果訪問臨界區(qū)的唯一方式是通過提交到調(diào)度串行隊列的任務(wù),那么不需要擔(dān)心臨界區(qū)的安全問題了。

Concurrent Queues 調(diào)度并發(fā)隊列(納米級誤差有序執(zhí)行)

并發(fā)隊列中任務(wù)的開始執(zhí)行是FIFO有序的而任務(wù)的完成順序則是任意的;不會知道何時開始運行下一個任務(wù),或者任意時刻有多少 Block 在運行。

何時開始一個 Block 完全取決于 GCD 。如果一個 Block 的執(zhí)行時間與另一個重疊,也是由 GCD 來決定是否將其運行在另一個不同的核心上,如果那個核心可用,否則就用上下文切換的方式來執(zhí)行不同的 Block 。

Queue Types 隊列類型(2大類6小種)

1)并發(fā)隊列(全局調(diào)度隊列)(Global Dispatch Queues):background、low、default和high優(yōu)先級。Apple的API也使用這些全局調(diào)度隊列,所以這些隊列中實際管理的任務(wù)既有應(yīng)用代碼指令任務(wù)也有平臺支持指令包中支持指令任務(wù)。

2)串行隊列:普通串行隊列和特殊串行隊列既主隊列(每次/同一時刻只能夠執(zhí)行一個任務(wù))。

注:主隊列中所有的模塊任務(wù)都只能由主線程執(zhí)行,不存在危險臨界區(qū)問題。同時,主線程是唯一可用于更新 UI的線程。主隊列中的代碼塊一般為刷新ui指令,這個隊列就是向UIView發(fā)生消息或發(fā)送通知。

3)6種隊列:主隊列,4個全局調(diào)度隊列,自建隊列

文/神主(簡書作者)

原文鏈接:http://www.itdecent.cn/p/20b59701b951

一切均來自轉(zhuǎn)載,只為了能更方便的學(xué)習(xí),如果作者不喜歡可聯(lián)系我刪除文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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