三十八、Linux 線程——線程屬性初始化、銷毀、設置和獲得分離屬性


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_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 函數並沒有調用到返回值,分離的線程已經自動釋放了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM