執行緒與並行模型

POSIX 執行緒(pthreads)

/ POSIX = PAHZ-icks; pthreads = PEE-threads /

當許多不同廠牌的汽車都把方向盤、油門、煞車放在相同的位置時,你不必重新學習就能開任何一台。標準對軟體做的就是這件事:它固定一個共通介面,讓同一個程式能在不同系統上運作。pthreads(POSIX 執行緒)就是 Unix 類系統上執行緒的那個標準,一組大家同意的函式名稱與行為,用來建立與協調執行緒,於是同一個用到執行緒的 C 程式可以在 Linux、macOS、各種 BSD 等系統上編譯並執行。

具體來說,pthreads 是一份規格(POSIX 標準的一部分),它定義的是一套應用程式介面(API),而不是某個特定實作,每個作業系統提供自己遵守這份規格的函式庫。核心的呼叫並不多、也容易學:pthread_create() 啟動一條新執行緒去跑你指定的函式;pthread_join() 讓呼叫者等待另一條執行緒結束並取回它的結果;pthread_exit() 結束呼叫端這條執行緒。同一份標準也定義了執行緒所需的同步原語,例如互斥鎖(pthread_mutex_lock 與 pthread_mutex_unlock)和條件變數,不過安全地使用它們屬於「同步」這個另外的主題。

為什麼重要:pthreads 是許多更高階執行緒工具所建立的基礎,而在 Linux 上一條 pthread 一對一地對映到一條核心執行緒,所以它能提供真正的平行。兩點誠實的提醒。第一,API 是關於名稱與行為的約定,和系統呼叫並不是同一回事,pthreads 是一個底下可能使用系統呼叫的函式庫,而 API 與核心之間的那條界線本身就是個獨立的概念。第二,pthreads 給你在執行緒之間共享資料的工具,但對你是否正確使用它們概不負責;忘了上鎖就會得到競爭。這份標準交到你手上的,是一件強大而鋒利的工具。

在 C 裡,你寫 pthread_create(&t, NULL, work, arg) 來在一條新執行緒上啟動 work() 函式,稍後再用 pthread_join(t, NULL) 等它結束。同樣這兩行在 Linux 與 macOS 上編譯並表現一致,這種可攜性正是標準的全部意義所在。

一個可攜的執行緒 API:相同的呼叫,許多作業系統。

pthreads 是一份規格與函式庫,本身不是系統呼叫;API 與系統呼叫的界線是另一個概念。它提供鎖,卻從不強制你使用,正確性仍是你的責任。

又称
POSIX threadsthe pthreads APIIEEE 1003.1cPOSIX 執行緒標準