unix環境中線程的建立與終止

2021-06-28 12:02:31 字數 2701 閱讀 4114

本篇來梳理一下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...