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 函数并没有调用到返回值,分离的线程已经自动释放了