[APUE]第十二章 線程控制

線程屬性:

初始化:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章