APUE學習之多執行緒程式設計(三) 執行緒屬性 同步屬性

2021-09-20 05:19:05 字數 4321 閱讀 4513

一、執行緒屬性

可以使用pthread_attr_t結構修改執行緒預設屬性,並這些屬性和建立的執行緒練習起來,可以使用pthread_att_init函式初始化pthread_attr_t結構,呼叫pthread_attr_init後,pthread_attr_t結構所包含的就是作業系統實現支援的所有執行緒屬性的預設值。

pthread_attr_destroy用於銷毀屬性物件,釋放資源。

#include int pthread_attr_init(pthread_attr_t *attr)

int pthread_attr_destroy(pthread_attr_t *attr)

執行緒屬性有四個:

1.detachstate 執行緒的分離狀態屬性

2.guardsize 執行緒棧末尾的警戒緩衝區大小(位元組數)

3.stackaddr 執行緒棧的最低位址

4.stacksize 執行緒棧的最小長度

如果在建立執行緒時就知道不需要了解執行緒的終止狀態,可以修改pthread_attr_t結構中的detachstate屬性,讓執行緒一開始就處於分離狀態。可以使用pthread_attr_setdetachstate把執行緒屬性detachstate設定為以下兩個合法值之一:pthread_create_detached,pthread_create_joinable.

#include int pthread_attr_getdetachstate(const pthread_attr_t *restrict attr, int *detachstate);

int pthread_attr_setdetachstate(const pthread_attr_t *attr, int *detachstate);

例子:

#include "

apue.h

"#include

int makethread(void *(*fn)(void *), void *arg)

err = pthread_attr_setdetachstate(&attr, pthread_create_detached);

if (err == 0

)

pthread_attr_destroy(&attr);

return

err;

}

view code

遵循posix標準的系統,未必支援執行緒棧屬性,可以在編譯階段用_posix_thread_attr_stackaddr和_posix_thread_attr_stacksize符號來檢查系統是否支援執行緒棧屬性。

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

#include int pthread_attr_getstack(const pthread_attr_t *restrict attr, void **restrick stackaddr, size_t *restrict stacksize)

int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr, size_t stacksize)

如果執行緒棧的虛位址空間用完了,那可以使用malloc或者mmap來為可替代的棧分配空間,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)

執行緒屬性guardsize控制著執行緒棧末尾之後用以避免棧溢位的擴充套件記憶體的大小。

#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)

二、互斥量屬性

對應非預設屬性,可以使用pthread_mutexattr_init初始化,pthread_mutexattr_destroy反初始化。

#include int pthread_mutexattr_init(pthread_mutexattr *attr)

int pthread_mutexattr_destroy(pthread_mutexattr *attr)

互斥量屬性中值得注意的兩個屬性:程序共享屬性,型別屬性

當程序共享屬性設為pthread_process_shared時,允許多個程序訪問共享資料,當程序共享屬性為pthread_process_private,則不允許。

#include int pthread_mutexattr_getpshared(const pthread_mutexattr_t *restrict attr, int *restrict pshared)

int pthread_mutexattr_setpshared(const pthread_muteattr_t *attr, int pshared)

型別屬性控制住互斥量的鎖定特性,值得注意的是其中的pthread_mutex_recursive型別,此型別允許同一執行緒在互斥量解鎖之前對該互斥量進行多次加鎖。遞迴互斥量維護鎖的基數,在解鎖次數和加鎖次數不相同的情況下,不解鎖。

#include int pthread_mutexattr_gettype(const pthread_mutexattr_t *restrict attr, int *restrict type)

int pthread_mutexattr_settype(pthread_mutexattr *attr, int type)

三、讀寫鎖屬性

使用pthread_rwlockattr_init初始化pthread_rwlockattr_t結構,用pthread_rwlockattr_destroy銷毀。

#include int pthread_rwlockattr_init(pthread_rwlockattr_t *attr)

int pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr)

讀寫鎖唯一屬性是程序共享屬性,與互斥量的程序共享屬性相同。

#include int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *restrict attr, int *restrict pshared)

int pthread_rwlockattr_setpshared(const pthread_rwlockattr_t *attr, int * pshared)

四、條件變數屬性

有一對用於初始化和銷毀的函式。

#include int pthread_condattr_init(pthread_condattr_t *attr)

int pthread_condattr_destroy(pthread_condattr_t *attr)

條件變數支援程序共享屬性和時鐘屬性,其中程序共享屬性與互斥量的程序共享屬性相同。

#include int pthread_condattr_getpshared(const pthread_condattr_t *restrict attr, int *restrict pshared)

int pthread_condattr_setpshared(const pthread_condattr_t *attr, int pshared)

時鐘屬性控制pthread_cond_timedwait函式的超時引數tsptr採用的是哪個時鐘。

#include int pthread_condattr_getclock(const pthread_condattr_t *restrict attr, clockid_t *restrict clock_id)

int pthread_condattr_setclock(pthread_condattr_t *attr, clockid_t clock_id)

Linux多執行緒學習(三)執行緒屬性

執行緒的建立函式pthread creat的第二個引數為pthread attr t型別的指標 預設屬性建立執行緒時賦值null pthread attr t是乙個結構體型別,定義如下 typedef struct pthread attr t 執行緒屬性的使用步驟 建立屬性物件 以預設值初始化屬性...

多執行緒學習(三) 執行緒的屬性

屬性名稱 用途注意事項 id每個執行緒都有自己的id,用於識別不同的執行緒 被後續建立的執行緒使用 不允許被修改 name 便於使用者在開發 除錯或執行過程中區分每個不同的執行緒 定位問題等 清晰有意義的名字 預設的名稱 isdaemon true 代表是守護執行緒,false 非守護執行緒 使用者...

C 多執行緒程式設計 三 執行緒間通訊

七 執行緒間通訊 一般而言,應用程式中的乙個次要執行緒總是為主執行緒執行特定的任務,這樣,主線程和次要執行緒間必定有乙個資訊傳遞的渠道,也就是主線程和次要執行緒間要進行通訊。這種執行緒間的通訊不但是難以避免的,而且在多執行緒程式設計中也是複雜和頻繁的,下面將進行說明。使用全域性變數進行通訊 由於屬於...