線程屬性:
初始化:
int pthread_attr_init(pthread_attr_t*attr);
int pthread_attr_destory(pthread_attr_t*attr);
分離狀態屬性設置和獲取
int pthread_attr_getdetachstate(constpthread_attr_t *attr, int * detachstate);
intpthread_attr_setdetachstate(pthread_attr_t * attr, int detachstate);
獲取線程堆棧大小
int pthread_attr_getstacksize(constpthread_attr_t * attr, size_t * size);
intpthread_attr_setstacksize(pthread_attr_t * attr, size_t size);
獲得棧末尾大小
int pthread_attr_getguardsize(constpthread_attr_t *attr, size_t *guardsize);
intpthread_attr_setguardsize(pthread_attr_t* attr, size_t guardsize);
同步屬性:
互斥量:
初始化:
intpthread_mutexattr_init(pthread_mutexattr_t * attr);
int pthread_mutexattr_destroy(pthread_mutexattr_t*attr);
互斥量有兩個重要的屬性
1 是多個進程共享屬性
通過
int pthread_mutexattr_getpshared(const pthread_mutexattr_t * attr,int* pshared);
int pthread_mutexattr_setpshared(const pthread_mutexattr_t * attr, int pshread);
共享屬性有兩種類型PTHREAD_PROCESS_PRIVATE、PTHREAD_PROCESS_SHARED
一般都是使用線程共享PTHREAD_PROCESS_PRIVATE,這是一般的情況,也是默認的情況。如果涉及到多個進程共享的時候,就得使用PTHREAD_PROCESS_SHARED來處理
2 是互斥量類型屬性
類型屬性有4類
PTHREAD_MUTEX_NORMAL:並不做任何特殊的錯誤檢查或死鎖檢查
PTHREAD_MUTEX_ERRORCHECK:互斥量提供錯誤檢查
PTHREAD_MUTEX_RECURSIVE:對互斥量能多次加鎖,但是必須得多次釋放鎖
PTHREAD_MUTEX_DEFAULT:操作系統實現的時候,會映射成其他類型。
通過函數int pthread_mutexattr_gettype(const pthread_mutexattr_t *attr, int*type);
獲得互斥量的類型
intpthread_mutexattr_settype(const pthread_mutexattr_t *attr, int type)
來設置互斥量的類型
讀寫鎖
初始化和destroy
int pthread_rwlockattr_init(pthread_rwlockattr_t* attr);
intpthread_rwlockattr_destroy(pthread_rwlockattr_t *attr);
讀寫鎖有進程共享屬性
int pthread_rwlockattr_getshared(constpthread_rwlockattr_t *attr, int *type);
int pthread_rwlockattr_setpshared(constpthread_rwlockattr_t* attr, int type);
條件變量也是
intpthread_condattr_init(pthread_condattr_t * attr);
intpthread_condattr_destroy(pthread_condattr_t* attr);
進程共享屬性
int pthread_condattr_getpshared(constpthread_condattr_t* attr, int* type);
int pthread_condattr_setpshared(constpthread_condattr_t* attr, int type);
可重入:信號可重入和線程可重入getenv那個例子。
線程私有數據
1 有時候需要維護基於每個線程的數據
2 它提供了讓基於進程的接口適應多線程環境的機制。,比如erron
創建鍵
int pthread_key_create(pthread_key_t *key,void(*destruct)(void*))
key是需要創建的,錯放着指向的內存單元,每個線程都可以和這個私有key關聯,互不干擾。剛開始創建鍵的時候,每個線程的數據地址設置爲NULL,destruct是私有數據的析構函數。線程退出,並且私有數據不爲空的話,就會調用析構函數,如果調用exit _exit _Exit abort的時候不會調用析構函數
取消鍵與線程私有數據之間的關聯。
int pthread_key_delete(pthread_key_t *key);
讓線程僅僅初始化依次,如static變量一樣
int pthread_once(pthread_once_t *initflag,void(*func)());
多個線程初始化一次func函數(僅僅調用一次)
initflag 必須初始化位PTHREAD_ONCE_INIT
線程獲得私有地址或者設置私有地址
int pthread_getspecific(pthread_key_t key);
int pthread_setspecific(pthread_key_t key, constvoid* value);
取消選項:
有兩個可取消狀態和可取消類型
int pthread_setcancelstate(int state, int*oldstate);
把當前狀態設置爲state,並把原來的狀態保存在oldstate
pthread_cancel調用並不是等待線程終止,在默認情況下,線程在取消請求發出後,還是要繼續運行的,知道線程達到某個取消點,取消點是線程檢查是否被取消並按照請求進行的動作的一耳光爲止
線程啓動是默認的取消狀態時PTHREAD_CANCEL_ENABLE當狀態設置爲PTHREAD_CANCEL_DISABLE時,對pthread_cancel的調用並不會殺死進程,相反,取消請求對這個線程來說是處於未決狀態的,當取消狀態再次編程PTHREAD_CANCEL_ENABLE的時候,線程會在下一個取消點對所有未決的取消請求進行處理。
這裏所描述的默認取消類型也是延遲取消,調用pthread_cancel以後,在線程到達取消點之前,並不會出現真正的取消,可以通過調用
int pthread_setcanceltype(int type, int*oldstate)來設置
type可以是:
PTHREAD_CANCEL_ASNCHRONOUS
PTHREAD_CANCEL_DEFERRED