免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4383 | 回复: 8
打印 上一主题 下一主题

为什么进程不等分离线程就退出了那? [复制链接]

论坛徽章:
1
双鱼座
日期:2014-08-25 19:13:11
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-25 16:25 |只看该作者 |倒序浏览
下面是代码。
很多书上说进程会等分离线程完成后才退出,但是我这里实验的结果不对阿,是怎么回事那?肯定大牛讲解以下~~
#include <stdio.h>
#include <pthread.h>
void * thread_func(void * arg)
{
        pthread_t id = pthread_self();
        printf("Thread 1 : %u start\n",id);
        sleep(10);
        fprintf(stderr,"Thread 1 :%u stop\n");
        return NULL;
}
int main()
{
        pthread_t thd1;
        int ret;
        pthread_attr_t attr;
        pthread_attr_init(&attr);
        pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
        ret=pthread_create(&thd1,&attr,thread_func,NULL);
        pthread_attr_destroy(&attr);
        if(ret != 0)
        {
                printf("Create thread 1 error!\n");
        }
        printf("Thread 1 : %u\n",thd1);
        return 0;
}

论坛徽章:
0
2 [报告]
发表于 2010-01-25 17:03 |只看该作者
正好和你说的相反,分离线程不会被其他的线程所等待,自己运行结束了,线程也就终止了,马上释放系统资源

论坛徽章:
1
双鱼座
日期:2014-08-25 19:13:11
3 [报告]
发表于 2010-01-25 17:06 |只看该作者
原帖由 rain_fish 于 2010-1-25 17:03 发表
正好和你说的相反,分离线程不会被其他的线程所等待,自己运行结束了,线程也就终止了,马上释放系统资源


那为什么在分离线程中的打印信息没有出现那?

论坛徽章:
0
4 [报告]
发表于 2010-01-25 17:29 |只看该作者

回复 #1 fxpbupt 的帖子

主线程都去世了,其他线程也会死掉的

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2010-01-25 18:02 |只看该作者

主线程的结尾不要用return()或exit()

main()最后一行用

pthread_exit(NULL);

谁用谁知道, 平常我都不告诉别人这个秘密

论坛徽章:
1
双鱼座
日期:2014-08-25 19:13:11
6 [报告]
发表于 2010-01-25 18:21 |只看该作者
原帖由 safedead 于 2010-1-25 18:02 发表
main()最后一行用

pthread_exit(NULL);

谁用谁知道, 平常我都不告诉别人这个秘密



大神阿!果然如此!
只是不知道为什么

论坛徽章:
0
7 [报告]
发表于 2010-01-25 20:51 |只看该作者
你主线程退出了,就意味着程序退出了!
请翻阅APUE里讲进程退出 的集中情况。其中一个叫做从main函数返回。因为你返回的比分离线程退出的早。所以就直接退出了。return前加pause测试下

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
8 [报告]
发表于 2010-01-25 21:07 |只看该作者
原帖由 rain_fish 于 2010-1-25 17:29 发表
主线程都去世了,其他线程也会死掉的

不是因为“主线程”去世了,而是因为进程去世了。

论坛徽章:
0
9 [报告]
发表于 2010-01-25 21:27 |只看该作者
原帖由 cjaizss 于 2010-1-25 21:07 发表

不是因为“主线程”去世了,而是因为进程去世了。

赞!
转载:
理论上说,pthread_exit()和线程宿体函数退出的功能是相同的,函数结束时会在内部自动调用pthread_exit()来清理线程相关的资源。但实际上二者由于编译器的处理有很大的不同。
在进程主函数(main())中调用pthread_exit(),只会使主函数所在的线程(可以说是进程的主线程)退出;而如果是return,编译器将使其调用进程退出的代码(如_exit()),从而导致进程及其所有线程结束运行。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP