一、執行緒屬性
可以使用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 "view codeapue.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;
}
遵循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)如果執行緒棧的虛位址空間用完了,那可以使用malloc或者mmap來為可替代的棧分配空間,stackaddr為棧的最低記憶體位址。int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr, size_t stacksize)
也可以通過pthread_attr_getstacksize和pthread_attr_setstacksize讀取或設定執行緒屬性stacksize。
#include int pthread_attr_getstacksize(const pthread_attr_t *restrict attr, size_t *restrict stacksize)執行緒屬性guardsize控制著執行緒棧末尾之後用以避免棧溢位的擴充套件記憶體的大小。int pthread_attr_setstacksize(pthread_attr_t *attr, size_t *stacksize)
#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)型別屬性控制住互斥量的鎖定特性,值得注意的是其中的pthread_mutex_recursive型別,此型別允許同一執行緒在互斥量解鎖之前對該互斥量進行多次加鎖。遞迴互斥量維護鎖的基數,在解鎖次數和加鎖次數不相同的情況下,不解鎖。int pthread_mutexattr_setpshared(const pthread_muteattr_t *attr, int pshared)
#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)時鐘屬性控制pthread_cond_timedwait函式的超時引數tsptr採用的是哪個時鐘。int pthread_condattr_setpshared(const pthread_condattr_t *attr, int pshared)
#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 多執行緒程式設計 三 執行緒間通訊
七 執行緒間通訊 一般而言,應用程式中的乙個次要執行緒總是為主執行緒執行特定的任務,這樣,主線程和次要執行緒間必定有乙個資訊傳遞的渠道,也就是主線程和次要執行緒間要進行通訊。這種執行緒間的通訊不但是難以避免的,而且在多執行緒程式設計中也是複雜和頻繁的,下面將進行說明。使用全域性變數進行通訊 由於屬於...