GCD(Grand Central Dispatch) 多執行緒 - Relearning Note
GCD 機制
GCD(Grand Central Dispatch) 是由 Apple 開發的一個函式庫,讓開發者能夠針對多核心裝置、多線程程序來最佳化,其設計是定義出「工作」以及「線程池」的概念。實際使用上,透過 Queue 的機制來方式工作,並依照 Queue 的特性,以及指派工作的類型來完成多執行緒的任務,提供非常簡單理解的使用方式。
Queue 的類型
Serial 序列型
序列型的 Queue,其中的任務會依序進行,一個接一個
Concurrent 併發型
併發型的 Queue,其中的任務會同時運行
Submission 的類型
Sync (Synchronous) 同步型
以 Sync 派遣的任務,會在原執行緒等待其任務完成並返回
Async (Asynchronous) 非同步型
以 Async 派遣的任務,會開新執行緒進行任務,原執行緒並不會等待返回
Queue 要怎樣產生?
內建的 main Queue
main Queue 主要用以變更 UI 相關程序,特性為為 Serial Queue
內建的 global Queue
global Queue 特性為 Concurrent Queue,並依據 QoS 可分為 6個 Queue,其權重由高至低為
- userInteractive
- userInitiated
- `default`
- utility
- background
- unspecified
自建立的 Queue
自建立的 Queue,可指定其特性為 Serial(預設)或是 Concurrent
簡單範例: Concurrent Queue with Multiple Async Tasks
Dispatch Group 監控多個 Work Item
Dispatch Group 可監控跨越多個 Queue 的 Work Item,在完成所有的項目時,在特定的 Queue 中進行接下來的邏輯程式。
併發型 DispatchQueue 中唯我獨尊的 Atomic 任務
在同一個併發的 DispatchQueue 的任務,會同時進行運作,但在可以透過特定的任務設定,讓此任務保有 Atomic 特性,完全與其他任務分開處理。那就是設定 Barier
如範例中,Barier B等待了 A & C 任務完全執行之後才開始運作,並等到運作玩之後 After 才接續進行。但很明顯的,Barier 的特性會造成效能的降低,所以在使用上也需要考量其必要性。
Deadlock
GCD 系統下,最常發生死結的狀況為:在序列 Dispatch Queue 的任務中,再 Sync 一個任務到 Dispatch Queue。因新指派的任務須等到原任務完成後才能進行,而原任務也在原地等待新任務完成,因此而形成死結。