linux中線程相關函式
2023年03月09日 星期二 22:18
1. 比較兩個執行緒 id 是否一致。
執行緒id 使用 pthread_t 資料型別來表示。linux 使用 unsigned long int 表示pthread_t 資料型別。solaris 9 把 pthread_t 資料型別表示為 unsigned int。freebsd5.2.1 和 mac os x 10.3 用乙個指向 pthread 結構的指標來表示pthread_t 資料型別。 因此如果需要考慮移植性,必須使用函式來對兩個執行緒id進行比較。
#
include
intpthread_equal
(pthread_t tid1,
pthread_t tid2)
;返回值:如果相等返回非0,否則返回0
2.獲取執行緒自身的執行緒id。
#
include
pthread_t pthread_self(
void);
返回值:呼叫執行緒的執行緒id
3.建立執行緒:
#
include
intpthread_create
(pthread_t
*restrict tidp,
const
pthread_attr_t
*restrict attr,
void*(
*start_rtn)
(void),
void
*restrict arg);
返回值:若成功返回0;如果失敗,返回錯誤編號
4.執行緒終止
如果程序中的任一線程呼叫了 exit,_exit或者 _exit 函式,那麼整個程序就會退出。與此類似,如果訊號的預設動作是終止程序,那麼,把該訊號傳送到執行緒會終止整個程序。
在不終止整個程序的情況下,單個執行緒可以通過下列三種方式退出:
1)執行緒只是從啟動例程中返回,返回值作為執行緒的退出碼。
2)執行緒可以被同一程序中的其他執行緒取消。
3)執行緒呼叫 pthread_exit。
#
include
void
pthread_exit
(void
*rval_ptr)
;
程序中的其他執行緒可以通過呼叫 pthread_join 函式訪問到這個指標。
#
include
intpthread_join
(pthread_t thread,
void
**rval_ptr)
;返回值: 若成功返回0,失敗返回錯誤編號
呼叫這個函式後,呼叫執行緒將一直阻塞,直到指定的執行緒以前面提到的3種方式退出,即:
1)執行緒只是從啟動例程中返回,返回值作為執行緒的退出碼。
2)執行緒可以被同一程序中的其他執行緒取消。
3)執行緒呼叫 pthread_exit。
如果執行緒只是從它的啟動例程中返回, rval_ptr將包含返回碼。如果執行緒被取消,由rval_ptr 指定的記憶體單元就置為 pthread_canceled。
如果執行緒已經處於分離狀態, pthread_join 呼叫就會失敗,返回 einval。
如果 rval_ptr 為 null,則呼叫pthread_join 函式將等待指定的執行緒終止,但是並不獲取執行緒的終止狀態。
5.請求取消同一程序中的其他執行緒
#
include
intpthread_cancel
(pthread_t tid)
;返回值:若成功則返回0,否則返回錯誤編號
在預設情況下,pthread_cancel 函式會使得由 tid 標識的執行緒的行為表現為如同呼叫了引數為 pthread_canceld的pthread_exit函式,但是,執行緒可以選擇忽略取消方式或者是控制取消方式。注 意,pthread_cancel並不等待執行緒終止,它僅僅是提出請求。
執行緒可以安排它退出時需要呼叫的函式,這與程序可以用 atexit 函式安排程序退出時需要呼叫的函式是類似的。這樣的函式稱為:執行緒清理處理程式(thread cleanup handler)。執行緒可以建立多個清理處理程式。處理程式記錄在棧中,也就是說他們的執行順序與他們註冊時的順序相反。
#
include
void
pthread_cleanup_push
(void
(*rtn)
(void*)
, void
*arg);
void
pthread_cleanup_pop
(int execute)
;
當執行緒執行以下動作時呼叫清理函式,呼叫引數為arg,清理函式 rtn 的呼叫順序是由pthread_cleanup_push 函式來安排的。
1)呼叫pthread_exit時。
2)響應取消請求時。
3)用非零 execute引數呼叫 pthread_cleanup_pop 時。
如果execute 引數為0,清理函式將不被呼叫。無論是否為0,pthread_cleanup_pop都將刪除上次 pthread_cleanup_push 呼叫建立的清理處理程式。
注意:
1)如果執行緒是通過從它的啟動例程中返回而終止的話(例如通過return函式),那麼它的清理處理程式就不會被呼叫。
2)清理處理程式是按照與他們安裝時相反的順序被呼叫的。
3)這些函式有乙個限制,由於他們可以實現為巨集,所以必須在與執行緒相同的作用域中以匹配對的形式使用,否則,程式編譯可能通不過。 pthread_cleanup_push 的巨集定義可包含字元 就要在 pthread_cleanup_pop 定義中出現。
6. pthread_detach 函式。
#include
int pthread_detach(pthread_t tid)
;返回值:若成功返回0,失敗返回錯誤編號
7.程序原語和執行緒原語的比較
程序原語 執行緒原語 描述
fork pthread_create 建立新的控制流
exit pthread_exit 從現有的控制流中退出
waitpid pthread_join 從控制流中得到退出狀態
atexit pthread_cancel_push 註冊在退出控制流時呼叫的函式
getpid pthread_self 獲取控制流的id
abort pthread_cancel 請求控制流的非正常退出
linux中線程的基本相關知識
在大型的工程中,使用執行緒並行處理資料能夠明顯加快執行處理速度,新增乙個執行緒主要有以下幾個步驟 1 建立執行緒,pthread create 2 初始化互斥鎖,pthread mutex init 3 申請互斥鎖,pthread mutex lock 4 釋放互斥鎖,pthread mutex u...
Linux中線程與訊號
由於程序中所有執行緒共享該程序訊號,所以執行緒庫將根據執行緒掩碼決定把訊號傳送給哪個具體的執行緒。因此在每個子執行緒中都單獨設定訊號掩碼,就很容易導致邏輯錯誤。此外,所有執行緒共享訊號處理函式。也就是說,乙個執行緒中設定了某個訊號的訊號處理函式後,它將覆蓋其他執行緒為同乙個訊號設定的訊號處理函式。所...
python中線程
程序和執行緒的區別 1.程序 每個程式都會有乙個程序,負責管理程式各個功能的執行,程序只會有乙個 而且至少有乙個 相當於包工頭 2.執行緒 每個程序裡面至少有乙個執行緒,稱之為主線程,除此以外還會有其他執行緒,稱之為分執行緒 執行緒是控制任務執行的最小單位 相當於農名工 3.程序負責控制各個執行緒的...