Pthread

Pthread

POSIX執行緒(POSIX threads),簡稱Pthreads,是執行緒的POSIX標準。該標準定義了創建和操縱執行緒的一整套API。在類Unix作業系統(Unix、Linux、Mac OS X等)中,都使用Pthreads作為作業系統的執行緒。Windows作業系統也有其移植版pthreads-win32 。

作用

執行緒庫實行了POSIX執行緒標準通常稱為Pthreads。POSIX執行緒具有很好的可移植性,使用pthreads編寫的代碼可運行於Solaris、FreeBSD、Linux 等平台,Windows平台亦有pthreads-win32可供使用 。

Pthreads定義了一套C語言的類型、函式與常量,它以pthread.h頭檔案和一個執行緒庫實現。

數據類型

pthread_t:執行緒ID

pthread_attr_t:執行緒屬性

操縱函式

pthread_create():創建一個執行緒

pthread_exit():終止當前執行緒

pthread_cancel():中斷另外一個執行緒的運行

pthread_join():阻塞當前的執行緒,直到另外一個執行緒運行結束

pthread_attr_init():初始化執行緒的屬性

pthread_attr_setdetachstate():設定脫離狀態的屬性(決定這個執行緒在終止時是否可以被結合)

pthread_attr_getdetachstate():獲取脫離狀態的屬性

pthread_attr_destroy():刪除執行緒的屬性

pthread_kill():向執行緒傳送一個信號

同步函式

用於 mutex 和條件變數

pthread_mutex_init() 初始化互斥鎖

pthread_mutex_destroy() 刪除互斥鎖

pthread_mutex_lock():占有互斥鎖(阻塞操作)

pthread_mutex_trylock():試圖占有互斥鎖(不阻塞操作)。即,當互斥鎖空閒時,將占有該鎖;否則,立即返回。

pthread_mutex_unlock(): 釋放互斥鎖

pthread_cond_init():初始化條件變數

pthread_cond_destroy():銷毀條件變數

pthread_cond_signal(): 喚醒第一個調用pthread_cond_wait()而進入睡眠的執行緒

pthread_cond_wait(): 等待條件變數的特殊條件發生

Thread-local storage(或者以Pthreads術語,稱作 執行緒特有數據):

pthread_key_create(): 分配用於標識進程中執行緒特定數據的鍵

pthread_setspecific(): 為指定執行緒特定數據鍵設定執行緒特定綁定

pthread_getspecific(): 獲取調用執行緒的鍵綁定,並將該綁定存儲在 value 指向的位置中

pthread_key_delete(): 銷毀現有執行緒特定數據鍵

pthread_attr_getschedparam();獲取執行緒優先權

pthread_attr_setschedparam();設定執行緒優先權

工具函式

pthread_equal(): 對兩個執行緒的執行緒標識號進行比較

pthread_detach(): 分離執行緒

pthread_self(): 查詢執行緒自身執行緒標識號

數據運用

函式套用背景:在單執行緒程式中,函式經常使用全局變數或靜態變數,這是不會影響程式的正確性的,但如果多執行緒調用的函式使用全局變數或靜態變數,則很可能引起編程錯誤,因為這些函式使用的全局變數和靜態變數無法為不同的執行緒保存各自的值,而當同一進程內的不同執行緒幾乎同時調用這樣的函式時就可能會有問題發生。而解決這一問題的一種方式就是使用執行緒特定數據的機制。

下面我們引入一個簡單程式實例,並以此作為介紹執行緒特定數據的案例。

執行緒特定數據:

可以想像,如果在多執行緒程式中,各個執行緒都依次調用函式 A 和函式 B,那么某些執行緒可能得不到期望的顯示結果,因為它使用 B 顯示的字元串可能並不是在 A 中設定的字元串。讀者會發現,這兩個函式非常的簡單,但在本章內容中,這兩個函式已經足以解釋執行緒特定數據的含義,因為這兩個函式代表了使用執行緒特定數據機制的一種典型場合,即有多個函式使用同一個全局變數。

POSIX要求實現POSIX的系統為每個進程維護一個稱之為 Key 的結構數組,這個數組中的每一個結構稱之為一個執行緒特定數據元素。POSIX 規定系統實現的 Key 結構數組必須包含不少於 128 個執行緒特定數據元素,而每個執行緒特定數據元素中至少包含兩項內容:使用標誌和析構函式指針。執行緒特定數據元素中的使用標誌指示這個數組元素是否正在使用,初始值為“不在使用”,我們稍後討論執行緒特定數據元素中的析構函式指針。在後面的介紹中,我們假設Key 結構數組中包含 128 個元素。

Key 結 構 數 組 中 每 個 元 素 的 索 引 (0~127) 稱 之 為 鍵 (key) 當 一 個 線 程 調 用,pthread_key_create 創建一個新的執行緒特定數據元素時,系統搜尋其所在進程的 Key 結構數組,找出其中第一個不在使用的元素,並返回該元素的鍵。這個函式的形式為:

參數 key 為一個 pthread_key_t變數的指針,用於保存得到的鍵值。參數 destructor為指定的析構函式的指針。除了 Key 結構數組,系統還在進程中維護關於每個執行緒的多種信息。這些特定於執行緒的信息被保存於稱之為 Pthread 的結構中。Pthread 結構中包含名為 pkey 的指針數組,其長度為128,初始值為空。這 128 個指針與 Key 結構數組的 128 個執行緒特定數據元素一一對應。在調用 pthread_key_create 得到一個鍵之後,每個執行緒可以依據這個鍵操作自己的 pkey 指針數組中對應的指針,這通過 pthread_getspecific 和 pthread_setspecific 函式來實現。這兩個函式的形式為:

pthread_getspecific 返回 pkey 中對應於 key 的指針,而 pthread_setspecific 將 pkey 中對應於 key 的指針設定為 value。我們使用執行緒特定數據機制,就是要使執行緒中的函式可以共享一些數據。如果我們線上程中通過 malloc 獲得一塊記憶體,並把這塊記憶體的指針通過 pthread_setspecific 設定到 pkey指針數組中對應於 key 的位置,那么執行緒中調用的函式即可通過 pthread_getspecific 獲得這個指針,這就實現了執行緒內部數據在各個函式間的共享。當一個執行緒終止時,系統將掃描該執行緒的 pkey數組,為每個非空的 pkey指針調用相應的析構函式,因此只要將執行回收的函式的指針在調用 pthread_key_create 時作為函式的參數,即可線上程終止時自動回收分配的記憶體區。

相關詞條

相關搜尋

熱門詞條

聯絡我們