今天遇到一个坑,折腾了一天才把这个坑填上,情况是这样的:

写了段代码,在main()函数中创建一个分离线程,结果这个线程什么都没干就直接挂掉了,代码长这样:

  1. int main()
  2. {
  3. 创建一个分离线程();
  4. return 0;
  5. }

后来百度)了一下,原来在main()函数中写return,会被编译器优化成,也会像exit一样直接杀死所有进程,所以分离出来的线程什么都没干,就随着进程一起挂掉了。

所以多线程编程中,main()函数想退出线程应当使用

  1. 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()),从而导致进程及其所有线程结束运行。

最新文章

  1. .Net中的加密解密
  2. 小记初试tornado与ajax,一些注意点
  3. ODOO 源代码安装要求
  4. media query学习笔记
  5. C语言中断言ASSERT
  6. python - Django: Converting an entire set of a Model's objects into a single dictionary - Stack Overflow
  7. 经典Loading 动漫赏析
  8. 笔记整理--Linux多线程
  9. Hive 报错:java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.metastore.HiveMetaStoreClient
  10. Joda-Time开源库
  11. redis的编译安装
  12. maven dependency的版本冲突问题
  13. Hanlp1.7版本的新增功能一览
  14. Python【每日一问】06
  15. 如何往linux上面上传东西
  16. Curry化函数
  17. Final互评------《弹球学成语》---- 杨老师粉丝群
  18. ql Server 2012完全卸载方法
  19. JAVA解压文件
  20. JavaScript基础DOM介绍和常用操作(5)

热门文章

  1. sql server 2008 R2连接失败 错误:18456
  2. CentOS7.5安装teamviwer13
  3. DOM方法index()相关问题(为何$(this).index(this)是错误的 )
  4. nginxhttp请求限制丶tcp会话限制和下载速度限制
  5. 【剑指offer】面试题 17. 打印从 1 到最大的 n 位数
  6. 洛谷P2751[USACO]工序安排
  7. RabbitMQ (十一) 消息确认机制 - 消费者确认
  8. URL获取并修改参数【转】
  9. VB查询数据库之组合查询——机房收费总结(二)
  10. luogu P1339 [USACO09OCT]热浪Heat Wave