38.1 線程屬性初始化和銷毀
1 #include <pthread.h> 2 int pthread_attr_init(pthread_attr_t *attr); 3 int pthread_attr_destroy(pthread_attr_t *attr);
- 返回值:成功返回 0;否則,返回錯誤編號
線程屬性結構如下:
38.2 設置和獲得分離屬性
1 #include <pthread.h> 2 int pthread_attr_getdetachstat(const pthread_attr_t *restrict attr, 3 int *detachstate); 4 int pthread_attr_setdetachstat(const pthread_attr_t *attr 5 int detachstate);
- detachstate 取值:
- PTHREAD_CREATE_JOINABLE(默認值) 正常啟動線程
- 必須調用 pthread_join 才能釋放線程占有的資源
- PTHREAD_CREATE_DETACHED 以分離狀態啟動線程
- 可以不調用 pthread_join,在線程結束后,會自動釋放占有的資源
- PTHREAD_CREATE_JOINABLE(默認值) 正常啟動線程
- 以默認方式啟動的線程,在線程結束后不會自動釋放占有的系統資源,要在主控線程中調用 pthread_join() 后才會釋放。
- 以分離狀態啟動的線程,在線程結束后會自動釋放所占有的系統資源
- 分離屬性在網絡通訊中使用的較多
38.3 例子
1 #include <stdio.h> 2 #include <pthread.h> 3 #include <stdlib.h> 4 #include <unistd.h> 5 6 void out_state(pthread_attr_t *attr) 7 { 8 int state; 9 if(pthread_attr_getdetachstate(attr, &state) != 0){ 10 perror("getdetachstate error"); 11 } 12 else{ 13 if(state == PTHREAD_CREATE_JOINABLE){ 14 printf("joinable state\n"); 15 } 16 else if(state == PTHREAD_CREATE_DETACHED){ 17 printf("detached state\n"); 18 } 19 else { 20 printf("error state\n"); 21 } 22 } 23 } 24 25 void *th_fn(void *arg) 26 { 27 int i; 28 int sum = 0; 29 for(i = 1; i <= 100; i++){ 30 sum += i; 31 } 32 return (void *)sum; 33 } 34 35 36 int main(void) 37 { 38 int err; 39 pthread_t default_th, detach_th; 40 41 /** 定義線程屬性 */ 42 pthread_attr_t attr; 43 /** 對線程屬性初始化 */ 44 pthread_attr_init(&attr); 45 /** 輸出分離屬性 */ 46 out_state(&attr); 47 48 /** 取分離屬性的默認值,以正常方式啟動子線程 */ 49 if((err = pthread_create(&default_th, &attr, th_fn, (void *)0)) != 0) { 50 perror("pthread create perror"); 51 } 52 int res; 53 if((err = pthread_join(default_th, (void *)&res)) != 0){ 54 perror("pthread join error"); 55 } 56 else { 57 printf("default return is %d\n", (int )res); 58 } 59 printf("-------------------------------------------------\n"); 60 61 62 /** 以分離狀態啟動子線程 */ 63 /** 設置分離屬性 */ 64 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); 65 out_state(&attr); 66 if((err = pthread_create(&detach_th, &attr, th_fn, (void *)0)) != 0) { 67 perror("pthread create perror"); 68 } 69 if((err = pthread_join(detach_th, (void *)&res)) != 0){ 70 perror("pthread join error"); 71 } 72 else { 73 printf("detach is %d\n", (int )res); 74 } 75 76 /** 銷毀線程屬性 */ 77 pthread_attr_destroy(&attr); 78 printf("0x%lx finished\n", pthread_self()); 79 sleep(1); 80 81 return 0; 82 }
在例子中,對分離狀態的線程使用 pthread_join 進行回收,編譯運行結果:
第 70 行報了錯誤,但是依然是成功,改用 fprintf 進行錯誤碼輸出:
修改后,運行結果:
說明 join 函數並沒有調用到返回值,分離的線程已經自動釋放了