Posix多執行緒程式設計學習筆記(一) 執行緒基礎(2)

2021-08-23 13:33:47 字數 3685 閱讀 8122

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 ...