本篇來梳理一下apue
第十一章中關於的三個知識點,因為執行緒的同步知識比較多,所以執行緒同步的知識在後面的文章中仔細梳理。
下面列出要梳理的三個知識點
1.執行緒標識
2.執行緒建立
3.執行緒終止
1執行緒標識
#include
int pthread_equal(pthread_t t1,pthread_t ,t2);
比較執行緒id
,如果相同則返回非零,否則返回零
man中有句話
compile and link with -pthread
表示編譯時要鏈結靜態函式庫,因為
pthread
庫不是linux
預設的庫,所以鏈結時要使用靜態函式庫
libpthread.a
,所以編譯時要加
-lpthread
,在apue
的程式清單
11-1
中會看到如果用
gcc編譯時
如果沒加-lpthread
會報錯11-1.c:(.text+0x83): undefined reference to `pthread_create'
2執行緒建立
#include
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);//與
apue
中的不同,
文章中的所有函式都是在ubuntu12.04
中的man
中查得pthread的四個引數:
(1)thread
指向的記憶體單元被設定為新建立的執行緒
id,注意引數是指向的是
pthread_t
的指標,
(2)attr
用與指定
thread
所指向執行緒的屬性
(3)start_routine
表示新建立的執行緒從
start_routine
函式的位址開始執行
(4)arg
表示start_routine
函式的引數,若要傳遞多個引數,則把多個引數放在
arg結構體中。
需要注意的三點:
(1)執行緒建立是並不能保證那個執行緒先執行:是新建立的執行緒還是呼叫執行緒。
(2)新建立的執行緒可一訪問程序的位址空間,比且繼承呼叫執行緒的浮點環境和訊號遮蔽字,但該程序的未決訊號集被清除
(3)注意pthread
函式在呼叫失敗時通常會返回錯誤碼,但並不像其他
posix
函式那樣設定
errno。
3執行緒終止
執行緒退出的3
種方式
(1)直接從函式中返回即return
(2)被同一程序中的其它執行緒取消
(3)執行緒呼叫pthread_exit();
1.#include
void pthread_exit(void *retval)
該函式用來終止執行緒,該函式的引數retval
可以通過呼叫
pthread_join
函式來訪問這個指標
2.#include
int pthread_join(pthread_t thread, void **retval);
呼叫執行緒將一直被阻塞,直到指定的的執行緒呼叫pthread_exit,從
函式中返回或者被取消
如果是從函式中返回retval
包含返回碼(即
return
的值),如果執行緒被取消,由
retval
指定的記憶體單元就被置為
pthread_canceled
如果對執行緒的返回值不感興趣,可以retval
的值置為
null
3.#include
int pthread_cancel(pthread_t thread);
(1)預設情況下,pthread_cancel
函式會使得由
thread
標誌的行為表現為如同呼叫了引數為
pthread_canceled
的pthread_exit
的函式
(2)執行緒可以選擇忽略取消方式或控制取消方式
(3)pthread_cancel並不等待執行緒終止,它僅僅提出請求。
4.#include
void pthread_cleanup_push(void (*rtn) (void*),void *arg);
void pthread_cleanup_pop(int execute);
當執行緒在執行以下動作時呼叫清理函式,呼叫引數為arg
,呼叫順序為在
pthread_clean_push
函式中先註冊的後呼叫:
(1)呼叫pthread_exit
函式時
(2)呼叫pthread_cancel
並響應取消請求時
(3)用非零execute
引數呼叫
pthread_cleanup_pop時
需要注意的是這兩個函式都是用巨集來實現的
#define pthread_cleanup_push(routine,arg)
所以這兩個函式必須成對出現。
執行緒 執行緒建立與終止
include intpthread create pthread t restrict thread,const pthread attr t restrict attr,void start routine void void restrict arg 0,失敗返回錯誤號。0,失敗返回 1,而錯...
執行緒控制(一) 執行緒的建立與終止
引言 我們先在學的執行緒都是使用者級庫執行緒 posix 我們通過基本的學習認識到了與執行緒有關的函式構成了乙個完整的系列,絕大多數的函式的名字都是以 pthread 打頭的,在使用這些函式的時候引入的標頭檔案是 pthread create函式 錯誤檢查 1 include 2 include 3...
多執行緒程式設計 執行緒的建立和終止
1 引言 linux 系統下的多執行緒遵循posix 執行緒介面,稱為pthread 編寫linux 下的多執行緒程式,需要使用標頭檔案pthread.h 連線時需要使用庫libpthread.a 順便說一下,linux 下pthread 的實現是通過系統呼叫clone 來實現的。clone 是li...