第11章 執行緒

2021-07-05 02:26:11 字數 2121 閱讀 2533

執行緒標識

就像每個程序有乙個程序id一樣,每個執行緒也有乙個執行緒id。程序id在整個系統中是唯一的,但執行緒id不同,執行緒id只有在它所屬的程序上下文中才有意義。

程序id 用pid_t資料型別表示

執行緒id用pthread_t資料型別來表示

#includeint pthread_equal(pthread_t tid1,pthread_t tid2)

返回值:若相等,返回非0數值;否則,返回0

執行緒可以通過呼叫pthread_self函式獲得自身的執行緒id

#includepthread_t pthread_self(void);

返回值:呼叫執行緒的執行緒id

這樣可以指定特定的執行緒完成特定的事情

執行緒建立

新增的執行緒可以通過呼叫pthread_create函式建立

#includeint pthread_create(pthread_t * restrict tidp, const pthread_attr_t *restrict attr, void *(*start_trn)(void *), void *restrict arg);

返回值: 若成功,返回0, 否則 返回錯誤編碼

當pthread_create成功返回時,新建立執行緒的執行緒id會被設定成tidp指向的記憶體單元。

attr引數用於定製各種不同的執行緒屬性。(設定為null 建立乙個具有預設屬性的執行緒)

新建立的執行緒從start_trn函式的位址開始執行,該函式只有乙個無型別指標引數arg。如果需要向start_trn函式傳遞的引數有乙個以上,那麼需要把這些引數放到乙個結構體重,然後把這個結構的位址作為arg引數傳入。

執行緒建立時並不能保證哪個執行緒會先執行:是新建立的執行緒,還是呼叫執行緒。

新建立的執行緒可以訪問程序的位址空間,並且繼承呼叫執行緒的浮點環境和訊號遮蔽字,但是該執行緒的掛起訊號集會被清除

#include "apue.h"

#include "pthread.h"

void printids(const char *s)

voud *thr_fn(void *arg)

int main(void)

本例項有兩個特別之處,需要處理主線程和新執行緒之間的競爭。第乙個特別:主線程需要休眠,如果主線程不休眠,它就可能退出,這樣新執行緒還沒有機會執行,整個程序就已經終止了。第二個特別在於新執行緒通過pthread_self函式獲取自己的執行緒id,而不是從共享記憶體讀取。

結果:main thread: pid 20075 tid 1 (0x1)

new thread:pid 20075 tid 2 (0x2)

執行緒終止

單個執行緒可以通過3種方式退出

1)執行緒可以簡單地從啟動例程中返回,返回值是執行緒的退出碼

2)執行緒可以被同一程序中的其它執行緒取消

3)執行緒呼叫pthread_exit

#includevoid pthread_exit(void *rval_ptr)
rval_ptr引數是乙個無型別指標。

#includevoid pthread_join(pthread_t thread,void **rval_ptr)
呼叫執行緒將一直阻塞,直到制定的執行緒呼叫票pthread_exit,從啟動例程中返回或者被取消

執行緒可以呼叫pthread_cancel函式來請求取消同一程序中的其它執行緒

#includeint pthread_cancel(pthread_t tid);

返回值:若成功 返回0 否則 返回錯誤編號

乙個執行緒可以建立多個清理處理程式。處理程式記錄在棧中,也就是說,它們的執行順序與它們註冊時相反。

#includeint pthread_cleanup_push(void (*trn)(void *),void *arg);

void pthread_cleanup_pop(int execute)

執行緒同步

互斥量 mutex  互斥變數是用pthread_mutex_t 資料型別表示的。使用前必須對其初始化

第11章 執行緒

1.執行緒的作用 1 對於程式設計而言 當我們的乙個程序在某一時刻,需要做的事件不止一件的時候,一般有兩種方法。一種是採用非同步程式設計的模式,一種是採用多執行緒同步模式。但是多執行緒同步模式遠遠比非同步模式要方便的多。但是對於單核系統,往往非同步程式設計模式效率更高。2 對於互動程式,一般都是要多...

第11章執行緒總結

1 執行緒標識 pthread t型別 int pthread equal pthread t tid1,pthread t tid2 pthread t pthread self 2 建立執行緒 int pthread create pthread t tid,pthread attr t att...

第11章 函式

1 把相關的語句組合在一起,並且賦予相應的名稱,用這種方法來給程式分塊,這種形式的組合就是函式,函式也叫例程或者過程。程式總是從 main 函式開始啟動。函式由函式名 引數 返回值型別以及一組包含操作語句的語句塊組成。函式可以支援過載,程式就是由函式組成。2 形參是函式定義時在形參表中定義的,並且由...