pthread的屬性對象

 

1.概述

屬性對象是爲對象初始化提供額外參數的容器。能夠簡單的將屬性對象想象爲一個結構體,不過這個結構體的變量的讀寫須要經過提供的函數而不是用成員訪問符直接操做其成員變量。屬性對象具體能夠實現爲結構體的棧變量,而後將訪問函數包裝爲各類宏。還能夠實現爲堆變量,而後使用真正的函數進行訪問,這樣的實現還能夠進行有效性檢查等其餘功能。 sql

POSIX中的屬性對象有pthread_t對應的屬性對象pthread_attr_tpthread_mutex_t對應的屬性對象pthread_mutexattr_tpthread_cond_t對應的屬性對象pthread_condattr_t這三種類型。 ide

POSIX對屬性對象的設計有如下好處:(1)對於初級用戶,你只須要傳入NULL就能夠了,專家級用戶可使用其它的擴展參數,可是使用的接口都同樣。(2)當屬性對象擴展了新的屬性後,並不影響現有的代碼。(3)以「標準的形式支持非標準的內容」,各個廠家能夠根據本身的硬件特性擴展屬性對象,而不影響POSIX標準中對接口的定義。 函數

2.互斥量的屬性

2.1 類型和接口

    

  
  
           
  
  
  1. pthread_mutexattr_t attr; 
  2.  
  3.     int pthread_mutexattr_init(pthread_mutexattr_t * attr); 
  4.  
  5.     int pthread_mutexattr_destroy(pthread_mutexattr_t *attr); 
  6.  
  7.     #ifdef _POSIX_THREAD_PROCESS_SHREAD 
  8.  
  9.     int pthread_mutexattr_getpshared(pthread_mutexattr_t *attr,int *pshared); 
  10.  
  11.     int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr,int pshared); 
  12.  
  13.     #endif 

2.2 pshared屬性

pshared屬性有兩個常量值:PTHREAD_PROCESS_SHAREDPTHREAD_PROCESS_PRIVATE。若是須要對能夠訪問同一互斥量但分佈在多個進程中的線程進行同步時,能夠將其值爲PTHREAD_PROCESS_SHARED。若是這些進程都分佈在當前的進程中,那麼將其值設置爲PTHREAD_PROCESS_PRIVATE,這個值也是默認值。 spa

3.信號量的屬性

3.1 類型和接口

    

  
  
           
  
  
  1. pthread_condattr_t attr; 
  2.  
  3.     int pthread_condattr_init(pthread_condattr_t * attr); 
  4.  
  5.     int pthread_condattr_destroy(pthread_condattr_t *attr); 
  6.  
  7.     #ifdef _POSIX_THREAD_PROCESS_SHARED 
  8.  
  9.     int pthread_condattr_getpshared(pthead_condattr_t *attr,int * pshared); 
  10.  
  11.     int pthread_condattr_setpshared(pthread_condatr_t *attr,int pshared); 
  12.  
  13.     #endif 

3.2 pshared屬性

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

4線程屬性

4.1 類型和接口

 

  
  
           
  
  
  1. pthread_attr_t attr; 
  2.  
  3. pthread_attr_init(pthread_attr_t *attr); 
  4.  
  5. pthread_attr_destroy(pthread_attr_t *attr); 
  6.  
  7. pthread_attr_getdetachstate(pthread_attr_t *attr,int *detachstate); 
  8.  
  9. pthread_attr_setdetachstate(pthread_attr_t *attr,int detachstate); 
  10.  
  11. #ifdef _POSIX_THREAD_STACKSIZE 
  12.  
  13. pthread_attr_getstacksize(pthread_attr_t *attr,size_t *stacksize); 
  14.  
  15. pthread_attr_setstacksize(pthread_attr_t *attr,size_t stacksize); 
  16.  
  17. #endif 
  18.  
  19. #ifdef _POSIX_THREAD_STACKADDR 
  20.  
  21. pthread_attr_getstackaddr(pthread_attr_t *attr,void * stackaddr); 
  22.  
  23. pthread_attr_setstackaddr(pthread_attr_t *attr,void * * stackaddr); 
  24.  
  25. #endif 

4.2 線程的屬性

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和線程的默認大小做爲基準。 orm

stackaddr的目的是使得用戶可以將內存中的某個區域設置爲線程的棧,這個內存區域的最小大小應該爲PTHREAD_STACK_MIN。此外,須要注意一個棧只能給一個線程使用。除非你不想獲得正確的結果。 對象

stackaddr這個屬性的兼容性比stacksize的兼容性更差。在設置stackaddr時,你須要知道你的機器棧在壓入數據後,棧指針移動的方向是從低地址向高地址移動仍是從高地址向地地址移動。同時還要明確棧指針是在壓入數據以前增加的仍是壓入數據以後增加的。這些因素都將影響第二個參數stackaddr的具體值。 接口

總之,建議是:儘可能不要設置棧地址。

相關文章
相關標籤/搜索