先要知道GCD字面意思是什么,GCD是Grand Central Dispatch的簡稱(大型中央處理器).
什么是GCD
GCD是放在libdispatch類庫中的,為并發代碼在多核硬件上執行提供支持。
GCD術語
串行和并發 ?(Serial vs Concurrent)
任務串行就是每次只有一個任務執行,任務并發就是在同一時間可以有多個任務被執行。
同步和異步 (Synchronous vs Asynchronous)
同步函數只在完成了它的預定任務后才返回。異步函數會立即返回,預定的任務會完成但不會等它完成再返回,所以異步函數不會阻塞當前線程去執行下一個函數。
臨界區 (Critical Section)
兩個線程不能同時執行同一段代碼。兩個線程同時改變共享資源時,會導致變量變質。
競態條件 (Race Condition)
基于特定序列或時機的事件的系統以不受控制的方式運行。
死鎖 (Deadlock)
兩個線程都卡住了,互相等待對方完成或執行其他操作。
線程安全 (Thread Safe)
線程安全是指代碼能夠被線程安全的調用,而不會有任何問題。比如 NSDictionary ?可以在多個線程中使用它,而NSMutableDictionary 多個線程使用時要保證它的安全,否則會導致它不可信。
并發與并行(Concurrency vs Parallelism)
并發代碼以并行的方式執行,這取決于系統。多核系統可以通過并行來同時執行多個線程。單核設備必須先運行一個線程,執行一個上下文切換,然后運行另一個線程,因為太快所以總覺得是并發執行。并行要求并發,并發卻不能保證并行。
Queues 隊列
首先接下什么是FIFO(First Input First Output的縮寫,先入先出隊列,這是一種傳統的按序執行方法,先進入的指令先完成并引退,跟著才執行第二條指令。)
GCD提供 dispatch queues來處理代碼塊。這些隊列管理任務用FIFO的順序執行,保證第一個添加的第一個執行,直到終點。
所有的dispatch queues 自身都是線程安全的。
兩種調度隊列(串行隊列和并發隊列)
串行隊列 (Serial Queues)
任務一次執行一個,只有前一個任務執行完才開始下一個。因為同時只執行一個任務的原因,從競態條件下保護了臨界區。所以保護臨界區的唯一方式就是通過提交到調度隊列的任務,就不用擔心臨界區的安全問題了。
并發隊列 (Concurrent Queues)
并發隊列只能保證會按照添加的順序開始執行,任務以任意順序完成,你不知道何時開始下一個任務,完全取決于GCD。GCD來決定在多核和單核上處理任務,來完成任務。
隊列類型 (Queues Types)
主隊列 (main queue) , 系統提供,串行隊列,它能保證所有任務都在主線程執行,而主線程是唯一可用于更新UI的線程。這個隊列通常用來發消息給UIView或發送通知。
全局調度隊列( Global Dispatch Queues),系統同時提供給你好幾個并發隊列,目前四個全局隊列有不同的優先級:background,low,default,high。
自己可以創建串行隊列或并發隊列。