三十八、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
");
15         }
16         else if(state == PTHREAD_CREATE_DETACHED){
17             printf("detached state
");
18         }
19         else {
20             printf("error state
");
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
", (int )res);
58     }
59     printf("-------------------------------------------------
");
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
", (int )res);
74     }
75 
76     /** 销毁线程属性 */
77     pthread_attr_destroy(&attr);
78     printf("0x%lx finished
", pthread_self());
79     sleep(1);
80 
81     return 0;
82 }

  在例子中,对分离状态的线程使用 pthread_join 进行回收,编译运行结果:

  

  第 70 行报了错误,但是依然是成功,改用 fprintf 进行错误码输出:

  

  修改后,运行结果:

  

  说明 join 函数并没有调用到返回值,分离的线程已经自动释放了

原文地址:https://www.cnblogs.com/kele-dad/p/10205922.html