6.名稱::
pthread_detach
功能:
使執行緒進入分離狀態。
標頭檔案:
#include
函式原形:
int pthread_detach(pthread_t tid);
引數:
返回值:
若成功則返回0,否則返回錯誤編號。
7.名稱::
pthread_cancel
功能:
取消同一程序中的其他執行緒
標頭檔案:
#include
函式原形:
int pthread_cancel(pthread_t tid);
引數:
tid 執行緒id
返回值:
若成功返回0,否則返回錯誤編號。
在預設的情況下,pthread_cancel函式會使由tid標識的執行緒的行為表現為如同呼叫了引數為pthead_canceled的pthread_exit函式,但是,執行緒可以選擇忽略取消方式和控制取消方式。pthread_cancel並不等待執行緒終止,它僅僅提出請求。 8.
名稱::
pthread_cancel_push/ pthread_cancel_push_pop
功能:
執行緒清理處理程式
標頭檔案:
#include
函式原形:
void pthread_cancel_push(void (*rtn)(void *),void *arg);
void pthread_cancel_pop(int execute);
引數:
rtn 處理程式入口位址
arg 傳遞給處理函式的引數
返回值: 無
執行緒可以安排它退出時需要呼叫的函式,這樣的函式稱為執行緒清理處理程式,執行緒可以建立多個清理處理程式。處理程式記錄在棧中,也就是說它們的執行順序與它們註冊時的順序相反。
要注意的是如果執行緒是通過從他的啟動例程中返回而終止的,它的處理程式就不會呼叫。還要注意清理處理程式是按照與它們安裝時相反的順序呼叫的。
#include
#include
void cleanup(void *arg)
void *thr_fn(void *arg) /*執行緒入口位址*/
int main()
八、一次性初始化
有時候我們需要對一些posix變數只進行一次初始化,如執行緒鍵(我下面會講到)。如果我們進行多次初始化程式就會出現錯誤。
在傳統的順序程式設計中,一次性初始化經常通過使用布林變數來管理。控制變數被靜態初始化為0,而任何依賴於初始化的**都能測試該變數。如果變數值仍然為0,則它能實行初始化,然後將變數置為1。以後檢查的**將跳過初始化。
但是在多執行緒程式設計中,事情就變的複雜的多。如果多個執行緒併發地執行初始化序列**,2個執行緒可能發現控制變數為0,並且都實行初始話,而該過程本該僅僅執行一次。初始化的狀態必須由互斥量保護。
如果我們需要對乙個posix變數靜態的初始化,可使用的方法是用乙個互斥量對該變數的初始話進行控制。但有時候我們需要對該變數進行動態初始化,pthread_once就會方便的多。 9.
名稱::
pthread_once
功能:
一次性初始化
標頭檔案:
#include
函式原形:
pthread_once_t once_control=pthread_once_init;
int pthread_once(pthread_once_t *once_control,void(*init_routine)(void));
引數:
once_control 控制變數
init_routine 初始化函式
返回值:
若成功返回0,若失敗返回錯誤編號。
型別為pthread_once_t的變數是乙個控制變數。控制變數必須使用pthread_once_init巨集靜態地初始化。
pthread_once函式首先檢查控制變數,判斷是否已經完成初始化,如果完成就簡單地返回;否則,pthread_once呼叫初始化函式,並且記錄下初始化被完成。如果在乙個執行緒初始時,另外的執行緒呼叫pthread_once,則呼叫執行緒等待,直到那個現成完成初始話返回。
下面就是該函式的程式例子:
#include
pthread_once_t once=pthread_once_init;
pthread_mutex_t mutex;) /*互斥量,我們後面會講到*/
void once_init_routine(void) /*一次初始化函式*/
void *child_thread(void *arg)
int main(int argc,char *argv[ ])
程式執行結果如下:
./once
i』m father,my id is 3086874304
init success!,my id is 3086874304
i』m child, my id is 3086871472
從上面的結果可以看到當主函式初始化成功後,子函式初始化失敗。
九、執行緒的私有資料
在程序內的所有執行緒共享相同的位址空間,任何宣告為靜態或外部的變數,或在程序堆宣告的變數,都可以被程序所有的執行緒讀寫。那怎樣才能使線程式擁有自己的私有資料呢。
posix提供了一種方法,建立執行緒鍵。
10.名稱::
pthread_key_create
功能:
建立執行緒私有資料鍵
標頭檔案:
#include
函式原形:
int pthread_key_create(pthread_key *key,void(*destructor)(void *));
引數:
key 私有資料鍵
destructor 清理函式
返回值:
若成功返回0,若失敗返回錯誤編號。
第乙個引數為指向乙個鍵值的指標,第二個引數指明了乙個
destructor
函式(清理函式),如果這個引數不為空,那麼當每個執行緒結束時,系統將呼叫這個函式來釋放繫結在這個鍵上的記憶體塊。這個函式常和函式
pthread_once
一起使用,為了讓這個鍵只被建立一次。函式
pthread_once
宣告乙個初始化函式,第一次呼叫
pthread_once
時它執行這個函式,以後的呼叫將被它忽略。
下面是程式例子:
#include
pthread_key_t tsd_key;
pthread_once_t key_once=pthread_once_init;
void once_routine(void)
void *child_thread(void *arg)
int main(int argc,char *argv[ ])
程式執行結果如下:
i』m father,my id is 3086231232
key create success! my id is 3086231232
i』m child,my id is 2086228400
Posix多執行緒程式設計學習筆記(五) 條
一 什麼是條件變數 與互斥鎖不同,條件變數是用來等待而不是用來上鎖的。條件變數用來自動阻塞乙個執行緒,直到某特殊情況發生為止。通常條件變數和互斥鎖同時使用。條件變數使我們可以睡眠等待某種條件出現。條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作 乙個執行緒等待 條件變數的條...
Posix多執行緒程式設計學習筆記(二) 執行緒屬性(3)
六 執行緒的作用域 函式 pthread attr setscope 和pthread attr getscope 分別用來設定和得到執行緒的作用域,這兩個函式的定義如下 7 名稱 pthread attr setscope pthread attr getscope 功能 獲得 設定執行緒的作用域...
Posix多執行緒程式設計學習筆記(二) 執行緒屬性(2)
四 執行緒的排程策略 函式 pthread attr setschedpolicy 和pthread attr getschedpolicy 分別用來設定和得到執行緒的排程策略。4.名稱 pthread attr getschedpolicy pthread attr setschedpolicy ...