深入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。機器堆棧向上增長的,必須指定爲低地址;機器堆棧向下增長的,必須指定爲高地址。這個屬性,最好不要用。
例程:
- #include <pthread.h>
- #include "error.h"
- #include <limits.h>
- pthread_attr_t attr;
- void* thread_routine(void* arg)
- {
- sleep(1);
- #ifdef _POSIX_THREAD_ATTR_STACKSIZE
- size_t stacksize;
- int status = pthread_attr_getstacksize(&attr, &stacksize);
- printf("[stacksize:%lu]thread routine is running..../n",stacksize);
- #endif
- return NULL;
- }
- int main()
- {
- pthread_t pid;
- int status;
- size_t stacksize;
- status = pthread_attr_init(&attr);
- if(status != 0)
- ERROR_ABORT(status,"Init attr");
- status = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
- if(status != 0)
- ERROR_ABORT(status, "Set detachstate");
- #ifdef _POSIX_THREAD_ATTR_STACKSIZE
- status = pthread_attr_getstacksize(&attr, &stacksize);
- if(status != 0)
- ERROR_ABORT(status, "Get stacksize");
- printf("Original thread size:%lu/n", stacksize);
- status = pthread_attr_setstacksize(&attr, 2*PTHREAD_STACK_MIN);
- if(status != 0)
- ERROR_ABORT(status, "Set stacksize");
- #endif
- status = pthread_create(&pid, &attr, thread_routine, NULL);
- if(status !=0 )
- ERROR_ABORT(status, "Create thread");
- status = pthread_attr_destroy(&attr);
- if(status != 0)
- ERROR_ABORT(status, "Destroy attr");
- printf("Main thread is over.../n");
- pthread_exit(NULL);