线程的分离

默认的情况下,线程是可连接的(也可称为结合态)。通俗的说,就是当线程退出时,其他线程可以通过调用pthread_join()获取其返回状态。但有时,在编程过程中,程序并不关心线程的返回状态,只是希望系统在线程终止时能够自动清理并移除。在这种情况下,可以调用pthread_detach()并向thread参数传入指定线程的标识符,将该线程标记为处于分离状态(分离态)。
#include <pthread.h>
int pthread_detach(pthread_t thread);
一旦线程处于分离状态,就不能再使用pthread_join()来获取其状态,也无法使其重返“可连接”状态。例如,下面的代码实现了线程的分离操作。
1 #include <stdio.h>
2 #include <pthread.h>
3
4 #define errlog(errmsg) do{perror(errmsg);
5 printf("–%s–%s–%d–\n",\
6 FILE, FUNCTION, LINE);
7 return -1;
8 }while(0)
9 void *thread_handler(void *arg){
10 pthread_detach(pthread_self());
11
12 int count = *((int *)arg);
13 while(count > 0){
14 printf(“thread…\n”);
15 sleep(1);
16 count–;
17 }
18 return NULL;
19 }
20 int main(int argc, const char *argv[])
21 {
22 pthread_t thread;
23 int arg = 3;
24 if(pthread_create(&thread, NULL,
25 thread_handler, (void *)&arg) != 0){
26 errlog(“pthread_create1 error”);
27 }
28 int temp = 0;
29 sleep(1);
30 if(pthread_join(thread, NULL) == 0){
31 printf(“pthread wait success\n”);
32 temp = 0;
33 }
34 else{
35 printf(“pthread wait failed\n”);
36 temp = 0;
37 }
38 return temp;
39 }
运行结果如下所示,结合上述代码示例,可以看出,在程序运行1秒钟后,已经成为分离态的线程,不会被pthread_join()等待回收。
linux@Master:~/1000phone$ ./a.out
thread…
pthread wait failed
同样的,针对上述设置线程分离状态的方法,也可以在线程刚一创建时即进行分离(而非之后再调用pthread_detach())。首先可以采用缺省的方式对线程属性结构进行初始化,接着为创建分离线程而设置属性,最后再以此线程属性结构来创建新线程,线程一旦创建,就无需再保留该属性对象。最后将其摧毁。
初始化线程属性结构,以及摧毁函数如下。
#include <pthread.h>
int pthread_attr_init(pthread_attr_t *attr);
int pthread_attr_destroy(pthread_attr_t *attr);
设置线程分离状态的函数为pthread_attr_setdetachstate()。
#include <pthread.h>
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
参数detachstate用来设置线程的状态,设置PTHREAD_CREATE_DETACHED(分离态)与PTHREAD_CREATE_JOINABLE(结合态)。设置分离态线程示例如下。
1 #include <stdio.h>
2 #include <pthread.h>
3
4 #define errlog(errmsg) do{perror(errmsg);
5 printf("–%s–%s–%d–\n",\
6 FILE, FUNCTION, LINE);
7 return -1;
8 }while(0)
9 void *thread_handler(void *arg){
10 printf(“thread…\n”);
11 return NULL;
12 }
13 int main(int argc, const char *argv[])
14 {
15 pthread_t thread;
16 pthread_attr_t attr;
17 if(pthread_attr_init(&attr) != 0){
18 errlog(“pthread_attr_init error”);
19 }
20 if(pthread_attr_setdetachstate(&attr,
21 PTHREAD_CREATE_DETACHED) != 0){
22 errlog(“pthread_attr_setdetachstate error”);
23 }
24 if(pthread_create(&thread, &attr,
25 thread_handler, NULL) != 0){
26 errlog(“pthread_create1 error”);
27 }
28 int temp = 0;
29 sleep(1);
30 if(pthread_join(thread, NULL) == 0){
31 printf(“pthread wait success\n”);
32 temp = 0;
33 }
34 else{
35 printf(“pthread wait failed\n”);
36 temp = 0;
37 }
38 return temp;
39 }
运行结果如下所示。
linux@Master:~/1000phone$ ./a.out
thread…
pthread wait failed

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值