先要知道GCD字面意思是什么少辣,GCD是Grand Central Dispatch的簡(jiǎn)稱(大型中央處理器).
什么是GCD
GCD是放在libdispatch類庫中的雅任,為并發(fā)代碼在多核硬件上執(zhí)行提供支持欣孤。
GCD術(shù)語
串行和并發(fā) ?(Serial vs Concurrent)
任務(wù)串行就是每次只有一個(gè)任務(wù)執(zhí)行,任務(wù)并發(fā)就是在同一時(shí)間可以有多個(gè)任務(wù)被執(zhí)行。
同步和異步 (Synchronous vs Asynchronous)
同步函數(shù)只在完成了它的預(yù)定任務(wù)后才返回。異步函數(shù)會(huì)立即返回量没,預(yù)定的任務(wù)會(huì)完成但不會(huì)等它完成再返回,所以異步函數(shù)不會(huì)阻塞當(dāng)前線程去執(zhí)行下一個(gè)函數(shù)突想。
臨界區(qū) (Critical Section)
兩個(gè)線程不能同時(shí)執(zhí)行同一段代碼殴蹄。兩個(gè)線程同時(shí)改變共享資源時(shí),會(huì)導(dǎo)致變量變質(zhì)猾担。
競(jìng)態(tài)條件 (Race Condition)
基于特定序列或時(shí)機(jī)的事件的系統(tǒng)以不受控制的方式運(yùn)行袭灯。
死鎖 (Deadlock)
兩個(gè)線程都卡住了,互相等待對(duì)方完成或執(zhí)行其他操作垒探。
線程安全 (Thread Safe)
線程安全是指代碼能夠被線程安全的調(diào)用妓蛮,而不會(huì)有任何問題。比如 NSDictionary ?可以在多個(gè)線程中使用它圾叼,而NSMutableDictionary 多個(gè)線程使用時(shí)要保證它的安全蛤克,否則會(huì)導(dǎo)致它不可信。
并發(fā)與并行(Concurrency vs Parallelism)
并發(fā)代碼以并行的方式執(zhí)行夷蚊,這取決于系統(tǒng)构挤。多核系統(tǒng)可以通過并行來同時(shí)執(zhí)行多個(gè)線程。單核設(shè)備必須先運(yùn)行一個(gè)線程惕鼓,執(zhí)行一個(gè)上下文切換筋现,然后運(yùn)行另一個(gè)線程,因?yàn)樘焖钥傆X得是并發(fā)執(zhí)行箱歧。并行要求并發(fā)矾飞,并發(fā)卻不能保證并行。
Queues 隊(duì)列
首先接下什么是FIFO(First Input First Output的縮寫呀邢,先入先出隊(duì)列洒沦,這是一種傳統(tǒng)的按序執(zhí)行方法,先進(jìn)入的指令先完成并引退价淌,跟著才執(zhí)行第二條指令申眼。)
GCD提供 dispatch queues來處理代碼塊瞒津。這些隊(duì)列管理任務(wù)用FIFO的順序執(zhí)行,保證第一個(gè)添加的第一個(gè)執(zhí)行括尸,直到終點(diǎn)巷蚪。
所有的dispatch queues 自身都是線程安全的。
兩種調(diào)度隊(duì)列(串行隊(duì)列和并發(fā)隊(duì)列)
串行隊(duì)列 (Serial Queues)
任務(wù)一次執(zhí)行一個(gè)濒翻,只有前一個(gè)任務(wù)執(zhí)行完才開始下一個(gè)屁柏。因?yàn)橥瑫r(shí)只執(zhí)行一個(gè)任務(wù)的原因,從競(jìng)態(tài)條件下保護(hù)了臨界區(qū)肴焊。所以保護(hù)臨界區(qū)的唯一方式就是通過提交到調(diào)度隊(duì)列的任務(wù)前联,就不用擔(dān)心臨界區(qū)的安全問題了功戚。
并發(fā)隊(duì)列 (Concurrent Queues)
并發(fā)隊(duì)列只能保證會(huì)按照添加的順序開始執(zhí)行娶眷,任務(wù)以任意順序完成,你不知道何時(shí)開始下一個(gè)任務(wù)啸臀,完全取決于GCD届宠。GCD來決定在多核和單核上處理任務(wù),來完成任務(wù)乘粒。
隊(duì)列類型 (Queues Types)
主隊(duì)列 (main queue) 豌注, 系統(tǒng)提供,串行隊(duì)列灯萍,它能保證所有任務(wù)都在主線程執(zhí)行轧铁,而主線程是唯一可用于更新UI的線程。這個(gè)隊(duì)列通常用來發(fā)消息給UIView或發(fā)送通知旦棉。
全局調(diào)度隊(duì)列( Global Dispatch Queues)齿风,系統(tǒng)同時(shí)提供給你好幾個(gè)并發(fā)隊(duì)列,目前四個(gè)全局隊(duì)列有不同的優(yōu)先級(jí):background绑洛,low救斑,default,high真屯。
自己可以創(chuàng)建串行隊(duì)列或并發(fā)隊(duì)列脸候。