Linux编程中的坑——C++中exit和return的区别
今天遇到一个坑,折腾了一天才把这个坑填上,情况是这样的:
写了段代码,在main()函数中创建一个分离线程,结果这个线程什么都没干就直接挂掉了,代码长这样:
- int main()
- {
- 创建一个分离线程();
- return 0;
- }
后来百度)了一下,原来在main()函数中写return,会被编译器优化成,也会像exit一样直接杀死所有进程,所以分离出来的线程什么都没干,就随着进程一起挂掉了。
所以多线程编程中,main()函数想退出线程应当使用
- pthread_exit(NULL);
补一下pthread_exit和return的区别:pthread_exit为直接杀死/退出当前进程,return则为退出当前函数,但是在g++编译器中,main中的return会被自动优化成exit,所以在主函数中使用return会退出所有线程的运行。
其实从原理来讲区别应该很大的,这里就先挖个坑写上这些,改天再来填。。。→_→
还有个比较明显的区别:return会调用局部对象的析构函数,而pthread_exit不会(不管是否main()函数,这个区别都是存在的)
用pthread_exit只会使主线程自身退出,产生的子线程继续执行;用return则所有线程退出。
综合以上要想让子线程总能完整执行(不会中途退出),一种方法是在主线程中调用pthread_join对其等待,即pthread_create/pthread_join/pthread_exit或return;一种方法是在主线程退出时使用pthread_exit,这样子线程能继续执行,即pthread_create/pthread_detach/pthread_exit;还有一种是pthread_create/pthread_detach/return,这时就要保证主线程不能退出,至少是子线程完成前不能退出。现在的项目中用的就是第三种方法,主线程是一个死循环,子线程有的是死循环有的不是。
<参考资料语>
理论上说,pthread_exit()和线程宿体函数退出的功能是相同的,函数结束时会在内部自动调用pthread_exit()来清理线程相关的资源。但实际上二者由于编译器的处理有很大的不同。
在进程主函数(main())中调用pthread_exit(),只会使主函数所在的线程(可以说是进程的主线程)退出;而如果是return,编译器将使其调用进程退出的代码(如_exit()),从而导致进程及其所有线程结束运行。
最新文章
- .Net中的加密解密
- 小记初试tornado与ajax,一些注意点
- ODOO 源代码安装要求
- media query学习笔记
- C语言中断言ASSERT
- python - Django: Converting an entire set of a Model's objects into a single dictionary - Stack Overflow
- 经典Loading 动漫赏析
- 笔记整理--Linux多线程
- Hive 报错:java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient
- Joda-Time开源库
- redis的编译安装
- maven dependency的版本冲突问题
- Hanlp1.7版本的新增功能一览
- Python【每日一问】06
- 如何往linux上面上传东西
- Curry化函数
- Final互评------《弹球学成语》---- 杨老师粉丝群
- ql Server 2012完全卸载方法
- JAVA解压文件
- JavaScript基础DOM介绍和常用操作(5)
热门文章
- sql server 2008 R2连接失败 错误:18456
- CentOS7.5安装teamviwer13
- DOM方法index()相关问题(为何$(this).index(this)是错误的 )
- nginxhttp请求限制丶tcp会话限制和下载速度限制
- 【剑指offer】面试题 17. 打印从 1 到最大的 n 位数
- 洛谷P2751[USACO]工序安排
- RabbitMQ (十一) 消息确认机制 - 消费者确认
- URL获取并修改参数【转】
- VB查询数据库之组合查询——机房收费总结(二)
- luogu P1339 [USACO09OCT]热浪Heat Wave