天天看點

pthread的屬性對象 1.概述 2.互斥量的屬性 3.信号量的屬性 4線程屬性

屬性對象是為對象初始化提供額外參數的容器。可以簡單的将屬性對象想象為一個結構體,不過這個結構體的變量的讀寫需要通過提供的函數而不是用成員通路符直接操作其成員變量。屬性對象具體可以實作為結構體的棧變量,然後将通路函數包裝為各種宏。還可以實作為堆變量,然後使用真正的函數進行通路,這樣的實作還可以進行有效性檢查等其他功能。

POSIX中的屬性對象有pthread_t對應的屬性對象pthread_attr_t,pthread_mutex_t對應的屬性對象pthread_mutexattr_t,pthread_cond_t對應的屬性對象pthread_condattr_t這三種類型。

POSIX對屬性對象的設計有以下好處:(1)對于初級使用者,你隻需要傳入NULL就可以了,專家級使用者可以使用其它的擴充參數,但是使用的接口都一樣。(2)當屬性對象擴充了新的屬性後,并不影響現有的代碼。(3)以“标準的形式支援非标準的内容”,各個廠家可以根據自己的硬體特性擴充屬性對象,而不影響POSIX标準中對接口的定義。

pthread_mutexattr_t attr; 

    int pthread_mutexattr_init(pthread_mutexattr_t * attr); 

    int pthread_mutexattr_destroy(pthread_mutexattr_t *attr); 

    #ifdef _POSIX_THREAD_PROCESS_SHREAD 

    int pthread_mutexattr_getpshared(pthread_mutexattr_t *attr,int *pshared); 

    int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr,int pshared); 

    #endif 

pshared屬性有兩個常量值:PTHREAD_PROCESS_SHARED和PTHREAD_PROCESS_PRIVATE。如果需要對可以通路同一互斥量但分布在多個程序中的線程進行同步時,可以将其值為PTHREAD_PROCESS_SHARED。如果這些程序都分布在目前的程序中,那麼将其值設定為PTHREAD_PROCESS_PRIVATE,這個值也是預設值。

pthread_condattr_t attr; 

    int pthread_condattr_init(pthread_condattr_t * attr); 

    int pthread_condattr_destroy(pthread_condattr_t *attr); 

    #ifdef _POSIX_THREAD_PROCESS_SHARED 

    int pthread_condattr_getpshared(pthead_condattr_t *attr,int * pshared); 

    int pthread_condattr_setpshared(pthread_condatr_t *attr,int pshared); 

條件變量的pshared屬性的含義同互斥量的pshared的屬性的含義相同。注意的是:使用共享的cond時,與之配合的mutex也應該是共享的。

pthread_attr_t attr; 

pthread_attr_init(pthread_attr_t *attr); 

pthread_attr_destroy(pthread_attr_t *attr); 

pthread_attr_getdetachstate(pthread_attr_t *attr,int *detachstate); 

pthread_attr_setdetachstate(pthread_attr_t *attr,int detachstate); 

#ifdef _POSIX_THREAD_STACKSIZE 

pthread_attr_getstacksize(pthread_attr_t *attr,size_t *stacksize); 

pthread_attr_setstacksize(pthread_attr_t *attr,size_t stacksize); 

#endif 

#ifdef _POSIX_THREAD_STACKADDR 

pthread_attr_getstackaddr(pthread_attr_t *attr,void * stackaddr); 

pthread_attr_setstackaddr(pthread_attr_t *attr,void * * stackaddr); 

POSIX規定的線程的屬性有:detachstate, stacksize, stackaddr, scope, inheritsched, schedpolicy, schedparam.

所有的線程系統都支援detachstate屬性。detachstate有兩個常量值:PTHREAD_CREATE_JOINABLE 和 PTHREAD_CREATE_DETACHED.其中,PTHREAD_CREATE_JOINABLE是預設的選項。如果使用設定了PTHREAD_CREATE_DETACHED的線程屬性建立了線程,則線程标示将不能在後續的代碼中繼續使用了。

stacksize的相容性不好,這是由于不同線程系統上對stack的值大小定義都不太相同。POSIX規定了一個常量PTHREAD_ATTR_MIN确定線程棧的需要最小空間。在設定線程棧大小的時候,最好以PTHREAD_ATTR_MIN和線程的預設大小作為基準。

stackaddr的目的是使得使用者能夠将記憶體中的某個區域設定為線程的棧,這個記憶體區域的最小大小應該為PTHREAD_STACK_MIN。此外,需要注意一個棧隻能給一個線程使用。除非你不想得到正确的結果。

stackaddr這個屬性的相容性比stacksize的相容性更差。在設定stackaddr時,你需要知道你的機器棧在壓入資料後,棧指針移動的方向是從低位址向高位址移動還是從高位址向地位址移動。同時還要明确棧指針是在壓入資料之前增長的還是壓入資料之後增長的。這些因素都将影響第二個參數stackaddr的具體值。

總之,建議是:盡量不要設定棧位址。

本文轉自hipercomer 51CTO部落格,原文連結:http://blog.51cto.com/hipercomer/939040