簡介
POSIX執行緒(英語:POSIX Threads,常被縮寫為Pthreads)是
POSIX的執行緒標準,定義了創建和操縱執行緒的一套
API。
API具體內容
Pthreads定義了一套C語言的類型、函式與常量,它以pthread.h頭檔案和一個執行緒庫實現。
Pthreads API中大致共有100個函式調用,全都以"pthread_"開頭,並可以分為四類:
POSIX的
SemaphoreAPI可以和Pthreads協同工作,但這並不是Pthreads的標準。因而這部分API是以"sem_"打頭,而非"pthread_"。
數據類型
pthread_t:執行緒句柄.出於移植目的,不能把它作為整數處理,應使用函式pthread_equal()對兩個執行緒ID進行比較。獲取自身所線上程id使用函式pthread_self()。
pthread_attr_t:執行緒屬性。主要包括scope屬性、detach屬性、堆疊地址、堆疊大小、優先權。主要屬性的意義如下:
__detachstate,表示新執行緒是否與進程中其他執行緒脫離同步。如果設定為PTHREAD_CREATE_DETACHED,則新執行緒不能用pthread_join()來同步,且在退出時自行釋放所占用的資源。預設為PTHREAD_CREATE_JOINABLE狀態。可以線上程創建並運行以後用pthread_detach()來設定。一旦設定為PTHREAD_CREATE_DETACHED狀態,不論是創建時設定還是運行時設定,則不能再恢復到PTHREAD_CREATE_JOINABLE狀態。
__schedpolicy,表示新執行緒的調度策略,包括SCHED_OTHER(正常、非實時)、SCHED_RR(實時、輪轉法)和SCHED_FIFO(實時、先入先出)三種,預設為SCHED_OTHER,後兩種調度策略僅對超級用戶有效。運行時可以用過pthread_setschedparam()來改變。
__schedparam,一個struct sched_param結構,目前僅有一個sched_priority整型變數表示執行緒的運行優先權。這個參數僅當調度策略為實時(即SCHED_RR或SCHED_FIFO)時才有效,並可以在運行時通過pthread_setschedparam()函式來改變,預設為0。系統支持的最大和最小的優先權值可以用函式sched_get_priority_max和sched_get_priority_min得到。
__inheritsched,有兩種值可供選擇:PTHREAD_EXPLICIT_SCHED和PTHREAD_INHERIT_SCHED,前者表示新執行緒使用顯式指定調度策略和調度參數(即attr中的值),而後者表示繼承調用者執行緒的值。預設為PTHREAD_EXPLICIT_SCHED。
__scope,表示執行緒間競爭CPU的範圍,也就是說執行緒優先權的有效範圍。POSIX的標準中定義了兩個值:PTHREAD_SCOPE_SYSTEM和PTHREAD_SCOPE_PROCESS,前者表示與系統中所有執行緒一起競爭CPU時間,後者表示僅與同進程中的執行緒競爭CPU。目前LinuxThreads僅實現了PTHREAD_SCOPE_SYSTEM一值。
pthread_mutex_init()初始化互斥鎖
pthread_mutex_destroy()刪除互斥鎖
pthread_mutex_lock():占有互斥鎖(阻塞操作)
pthread_mutex_trylock():試圖占有互斥鎖(不阻塞操作)。即,當互斥鎖空閒時,將占有該鎖;否則,立即返回。
pthread_mutex_unlock(): 釋放互斥鎖
pthread_mutexattr_(): 互斥鎖屬性相關的函式
pthread_cond_init():初始化條件變數
pthread_cond_destroy():銷毀條件變數
pthread_cond_signal(): 傳送一個
信號給正在當前條件變數的執行緒佇列中處於阻塞等待狀態的執行緒,使其脫離阻塞狀態,喚醒後繼續執行。如果沒有執行緒處在阻塞等待狀態,pthread_cond_signal也會成功返回。一般只給一個阻塞狀態的執行緒發信號。假如有多個執行緒正在阻塞等待當前條件變數,則根據各等待執行緒優先權的高低確定哪個執行緒接收到信號開始繼續執行。如果各執行緒優先權相同,則根據等待時間的長短來確定哪個執行緒獲得信號。但pthread_cond_signal在多處理器上可能同時喚醒多個執行緒,當只能讓一個被喚醒的執行緒處理某個任務時,其它被喚醒的執行緒就需要繼續wait。POSIX規範要求pthread_cond_signal至少喚醒一個pthread_cond_wait上的執行緒,有些實現為了簡便,在單處理器上也會喚醒多個執行緒。所以最好對pthread_cond_wait()使用while循環對條件變數是否滿足做條件判斷。
pthread_cond_wait(): 等待條件變數的特殊條件發生;pthread_cond_wait() 必須與一個pthread_mutex配套使用。該函式調用實際上依次做了3件事:對當前pthread_mutex解鎖、把當前執行緒掛起到當前條件變數的執行緒佇列、被其它執行緒的信號喚醒後對當前pthread_mutex申請加鎖。如果執行緒收到一個信號被喚醒,將被配套的互斥鎖重新鎖住,pthread_cond_wait() 函式將不返回直到執行緒獲得配套的互斥鎖。需要注意的是,一個條件變數不應該與多個互斥鎖配套使用。
pthread_cond_broadcast(): 某些套用,如
執行緒池,pthread_cond_broadcast喚醒全部執行緒,但我們通常只需要一部分執行緒去做執行任務,所以其它的執行緒需要繼續wait.
pthread_condattr_(): 條件變數屬性相關的函式
執行緒私有存儲(Thread-local storage):
pthread_key_create(): 分配用於標識進程中執行緒特定數據的pthread_key_t類型的鍵
pthread_key_delete(): 銷毀現有執行緒特定數據鍵
pthread_setspecific(): 為指定執行緒的特定數據鍵設定綁定的值
pthread_getspecific(): 獲取調用執行緒的鍵綁定值,並將該綁定存儲在 value 指向的位置中
同步屏障函式
其它多執行緒同步函式:
工具函式:
pthread_equal(): 對兩個執行緒的執行緒標識號進行比較
pthread_detach(): 分離執行緒
pthread_self(): 查詢執行緒自身執行緒標識號
pthread_once(): 某些需要僅執行一次的函式。其中第一個參數為pthread_once_t類型,是內部實現的互斥鎖,保證在程式全局僅執行一次。
sem_open:創建或者打開已有的命名信號量。可分為二值信號量與計數信號量。命名信號量可以在進程間共享使用。
sem_close:關閉一個信號燈,但沒有將它從系統中刪除。命名信號燈是隨核心持續的,即使當前沒有進程打開著某個信號燈,它的值仍然保持。
sem_unlink:從系統中刪除信號燈。
sem_getvalue:返回所指定信號燈的當前值。如果該信號燈當前已上鎖,那么返回值或為0,或為某個負數,其絕對值就是等待該信號燈解鎖的執行緒數。
sem_wait:申請共享資源,所指定信號燈的值如果大於0,那就將它減1並立即返回,就可以使用申請來的共享資源了。如果該值等於0,調用執行緒就被進入睡眠狀態,直到該值變為大於0,這時再將它減1,函式隨後返回。sem_wait操作必須是原子操作。
sem_trywait:申請共享資源,當所指定信號燈的值已經是0時,後者並不將調用執行緒投入睡眠。相反,它返回一個EAGAIN錯誤。
sem_post:釋放共享資源。與sem_wait恰相反。
sem_init:初始化非命名(記憶體)信號量
sem_destroy:摧毀非命名信號量
共享記憶體函式,包含在sys/mman.h中,連結時使用rt庫:
mmap:把一個檔案或一個POSIX共享記憶體區對象映射到調用進程的地址空間。使用該函式的目的: 1.使用普通檔案以提供記憶體映射I/O 2.使用特殊檔案以提供匿名記憶體映射。 3.使用shm_open以提供無親緣關係進程間的Posix共享記憶體區。
munmap: 刪除一個映射關係
msync:檔案與記憶體同步函式
shm_open:創建或打開共享記憶體區
shm_unlink:刪除一個共享記憶體區對象的名字,刪除一個名字僅僅防止後續的open,msq_open或sem_open調用取得成功。
ftruncate:調整檔案或共享記憶體區大小
fstat來獲取有關該對象的信息