Linux多執行緒程式設計(二) 執行緒屬性

2021-07-31 00:16:32 字數 2844 閱讀 4281

pthread介面允許我們通過設定每個物件關聯的不同屬性來細調執行緒的行為。

#include int pthread_attr_init(pthread_attr_t *attr);

int pthread_attr_destroy(pthread_attr_t *attr);

兩個函式的返回值:若成功,返回0;否則,返回錯誤編號

如果要反初始化pthread_attr_t結構,可以呼叫pthread_attr_destroy函式。如果pthread_attr_init的實現對實現屬性物件的記憶體空間是 動態分配的,pthread_attr_destroy就會釋放該記憶體空間。除此之外,pthread_attr_destroy還會用無效的值初始化屬性物件,因此,如果該屬性物件被誤用,將會導致pthread_create函式返回錯誤**。

如果在建立執行緒時就知道不需要了解執行緒的終止狀態,就可以修改pthread_attr_t結構中的detachstate設定成以下兩個合法值之一:pthread_create_detached,以分離狀態啟動執行緒;或者pthread_create_joinable,正常啟動執行緒,應用程式可以獲取執行緒的終止狀態。

#include int pthread_attr_getdetachstate(const pthread_attr_t *restrict attr,

int *detachstate);

int pthread_attr_setdetachstate(pthread_attr_t *attr, int *detachstate)

兩個函式的返回值:若成功,返回0;否則,返回錯誤編號

可以呼叫pthread_attr_getdetachstate函式 獲取當前的detachstate執行緒屬性。第二個引數所指向的整數要麼設定成pthread_create_detached,要麼設定成pthread_create_joinable,具體要取決於給定 pthread_attr_t結構中的屬性值。

可以使用函式pthread_attr_getstack和pthread_attr_setstack對執行緒棧屬性進行管理。

#include int pthread_attr_getstack(const pthread_attr_t *restrict attr,

void **restrict stackaddr,

size_t *restrict stacksize);

int pthread_attr_setstack(pthread_attr_t *attr,

void *stackaddr, size_t stacksize);

兩個函式的返回值:若成功,返回0;否則,返回錯誤編號

對於程序來說,虛位址空間的大小是固定的。因為程序中只有乙個棧,所以它的大小通常不是問題。但對於執行緒來說,同樣大小的虛位址空間必須被所以的執行緒棧共享。如果應用程式使用了許多執行緒,以致這些執行緒棧的累計大小超過了可用的虛位址空間,就需要減少預設的執行緒棧大小。另一方面,如果執行緒呼叫的函式分配了大量的自動變數,或者呼叫的函式涉及許多很深的棧幀,那麼需要的棧大小可能要比預設的大。

如果執行緒的虛位址空間都用完了,那可以使用malloc或者mmap來為可替代的棧分配空間,並用pthread_attr_setstack函式來改變新建執行緒的棧位置。由stackaddr引數指定的位址可以用作執行緒棧的記憶體範圍中的最低可定址位址,該位址與處理器結構相應的邊界應對其。當然,這要假設malloc和mmap所用的虛位址範圍與程式棧當前使用的虛位址範圍不同。

stackaddr執行緒屬性被定義為棧的最低記憶體位址,但這並不一定是棧的開始位址位置。對於乙個給定的處理器結構來說,如果棧是從高位址向低位址方向增長的,那麼stackaddr執行緒屬性將是棧的結尾位置,而不是開始位置。

應用程式也可以通過pthread_attr_getstacksize和pthread_attr_setstacksize函式讀取或設定執行緒屬性stacksize。

#include int pthread_attr_getstacksize(const pthread_attr_t *restrict attr,

size_t *restrict stacksize);

int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);

兩個函式的返回值:若成功,返回0;否則,返回錯誤編號

如果希望改變預設的棧大小,但又不想自己處理執行緒棧的分配問題,這時使用pthread_attr_setstacksize函式就非常有用。設定stacksize屬性時,選擇的stacksize不能小於pthread_stack_min。

執行緒屬性guardsize控制著執行緒棧末尾之後用以避免棧溢位的擴充套件記憶體的大小。這個屬性預設值是有具體實現來定義的,但常用值是系統頁大小。可以把guardsize執行緒屬性設定為0,不允許屬性的這種特徵行為發生:在這種情況下,不會提供警戒緩衝區。同樣,如果修改了執行緒屬性stackaddr,系統就認為我們將自己管理棧,進而使警戒緩衝區機制無效,這等同於把guardsize執行緒屬性設定為0.

#include int pthread_attr_getguardsize(const pthread_attr_t *restrict attr,

size_t *restrict guardsize);

int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);

兩個函式的返回值:若成功,返回0;否則,返回錯誤編號

如果guardsize執行緒屬性被修改來了,作業系統可能會把它取為頁大小的整數倍。如果執行緒的棧指標溢位到警戒區域,應用程式就可以通過信函接收到出錯資訊。

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

Posix多執行緒程式設計學習筆記(二) 執行緒屬性(2)

四 執行緒的排程策略 函式pthread attr setschedpolicy和pthread attr getschedpolicy分別用來設定和得到執行緒的排程策略。4.名稱 pthread attr getschedpolicy pthread attr setschedpolicy 功能 ...