深入Pthread(五):線程屬性

深入Pthread(五):線程屬性

 

線程屬性相關API


phtread_attr_t attr;
int pthread_attr_init(pthread_attr_t* attr);
int pthread_attr_destroy(pthread_attr_t* attr);
int pthread_attr_getdetachstate(pthread_attr_t* attr, int* detachstate);
int pthread_attr_setdetachstate(pthread_attr_t* attr, int detachstate);
 
#ifdef _POSIX_THREAD_ATTR_STACKSIZE
int pthread_attr_getstacksize(pthread_attr_t* attr, size_t* stacksize);
int pthread_attr_setstacksize(pthread_attr_t* attr, size_t stacksize);
#endif
 
#ifdef _POSIX_THREAD_ATTR_STACKADDR
int pthread_attr_getstackaddr(pthread_attr_t* attr, void* stackaddr);
int pthread_attr_setstackaddr(pthread_attr_t* attr, void** stackaddr); 
#endif
 

線程屬性


POSIX定義的線程屬性有:可分離狀態(detachstate), 線程棧大小(stacksize),線程棧地址( stackaddr),作用域(scope), 繼承調度(inheritsched), 調度策略(schedpolicy)和調度參數( schedparam)。 有些系統並不支持所有這些屬性,使用前注意查看系統文檔。
 
    但是所有Pthread系統都支持detachstate屬性,該屬性可以是PTHREAD_CREATE_JOINABLE或PTHREAD_CREATE_DETACHED,默認的是joinable的。擁有joinable屬性的線程可以被另外一個線程等待,同時還可以獲得線程的返回值,然後被回收。而detached的線程結束時,使用的資源立馬就會釋放,不用其他線程等待。
 
    線程stacksize屬性移植性不是很好,若你的系統定義了_POSIX_THREAD_ATTR_STACKSIZE ,纔可以調用api設定線程堆棧大小。Pthreads規定線程堆棧大小必須大於等於PTHREAD_STACK_MIN。
 
    線程stackaddr屬性移植性相當不好,若系統定義了_POSIX_THREAD_ATTR_STACKADDR,纔可以調用api設定線程堆棧地址,指定一塊內存區域,這塊內存區域大小至少是PTHREAD_STACK_MIN。機器堆棧向上增長的,必須指定爲低地址;機器堆棧向下增長的,必須指定爲高地址。這個屬性,最好不要用。
 
 

例程:

 

  1. #include <pthread.h>  
  2. #include "error.h"  
  3. #include <limits.h>  
  4.   
  5. pthread_attr_t attr;  
  6.   
  7.   
  8. void* thread_routine(void* arg)  
  9. {  
  10.     sleep(1);  
  11. #ifdef _POSIX_THREAD_ATTR_STACKSIZE  
  12.     size_t stacksize;  
  13.     int status = pthread_attr_getstacksize(&attr, &stacksize);  
  14.     printf("[stacksize:%lu]thread routine is running..../n",stacksize);  
  15. #endif  
  16.   
  17.     return NULL;  
  18. }  
  19.   
  20. int main()  
  21. {  
  22.     pthread_t pid;  
  23.     int status;  
  24.     size_t stacksize;  
  25.     status = pthread_attr_init(&attr);  
  26.     if(status != 0)  
  27.         ERROR_ABORT(status,"Init attr");  
  28.   
  29.     status = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);  
  30.     if(status != 0)  
  31.         ERROR_ABORT(status, "Set detachstate");  
  32.   
  33. #ifdef _POSIX_THREAD_ATTR_STACKSIZE  
  34.     status = pthread_attr_getstacksize(&attr, &stacksize);  
  35.     if(status != 0)  
  36.         ERROR_ABORT(status, "Get stacksize");  
  37.     printf("Original thread size:%lu/n", stacksize);  
  38.   
  39.     status = pthread_attr_setstacksize(&attr, 2*PTHREAD_STACK_MIN);  
  40.     if(status != 0)  
  41.         ERROR_ABORT(status, "Set stacksize");  
  42. #endif  
  43.   
  44.     status = pthread_create(&pid, &attr, thread_routine, NULL);  
  45.     if(status !=0 )  
  46.         ERROR_ABORT(status, "Create thread");  
  47.   
  48.     status = pthread_attr_destroy(&attr);  
  49.     if(status != 0)  
  50.         ERROR_ABORT(status, "Destroy attr");  
  51.   
  52.     printf("Main thread is over.../n");  
  53.     pthread_exit(NULL);  

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