GCD(Grand Central Dispatch) 多執行緒 - Relearning Note

Terry Huang
安郡尼爾筆記
Published in
Dec 9, 2020

GCD 機制

GCD(Grand Central Dispatch) 是由 Apple 開發的一個函式庫,讓開發者能夠針對多核心裝置、多線程程序來最佳化,其設計是定義出「工作」以及「線程池」的概念。實際使用上,透過 Queue 的機制來方式工作,並依照 Queue 的特性,以及指派工作的類型來完成多執行緒的任務,提供非常簡單理解的使用方式。

Queue 的類型

Serial 序列型

序列型的 Queue,其中的任務會依序進行,一個接一個

Concurrent 併發型

併發型的 Queue,其中的任務會同時運行

Source: Swift Dev Center

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。因新指派的任務須等到原任務完成後才能進行,而原任務也在原地等待新任務完成,因此而形成死結。

應用: Thread-Safe Array

--

--

Terry Huang
安郡尼爾筆記

Co-Founder of LiRise Co.,Ltd. In charge of innovative affairs development. Tags: Guitar, Golf, Photograph, Cocktail, Dance, Diving, Travel.