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()),从而导致进程及其所有线程结束运行。
相关文章
- Linux学习之文件系统常用命令(七)
- [Linux] linux awk命令详解
- Linux C 中 fork() 函数详解
- 每天一个linux命令(23):Linux 目录结构
- [linux]Linux下的log
- yii定时任务(linux)
- Linux Shell脚本自动化编程实战- shell并发
- 推荐一个linux下的web压力测试工具神器webbench
- linux 修改文件打开数量限制
- Linux 0.11-进入main函数前最后一跃-10
- ASP.NETCore微服务(七)——【docker部署linux上线】(ECS+linux+docker+API上线部分)
- Linux 下串口编程(C++ 程序设计)
- Linux下C++11的线程类用法(可连接线程和可分离线程thread)
- 【Linux 内核】Linux 内核体系架构 ( 进程调度 | 内存管理 | 中断管理 | 设备管理 | 文件系统 )
- Linux pipe功能
- 【Linux】linux经常使用基本命令
- L82.linux命令每日一练 -- 第11章 Linux系统管理命令 -- dmidecode和lspci
- L54.linux命令每日一练 -- 第八章 Linux磁盘与文件系统管理命令 -- umount和df
- L46.linux命令每日一练 -- 第七章 Linux用户管理及用户信息查询命令 -- w和who
- L45.linux命令每日一练 -- 第七章 Linux用户管理及用户信息查询命令 -- sudo和id
- L44.linux命令每日一练 -- 第七章 Linux用户管理及用户信息查询命令 -- su和visudo
- AI模型C++部署:ubuntu安装Cython并使用C/C++调用python动态库【附加c++与python互相调用算法demo程序接口的源码】
- linux 下 c++ clock 函数理解
- 嵌入式linux开发,C/C++交叉编译报错:xxx.mak:41: recipe for target ‘xxx.o‘ failed make: *** [xxx.o] Error 127
- 嵌入式Linux开发,Ubuntu下交叉编译内核报错:error while loading shared libraries: /lib/x86_64-linux-gnu/libc++.so:
- geo ftp环境变量 export source ~/.bashrc Linux中filezilla下载ftp文件 ftp.ncbi.nlm.nih.gov linux下载 ftp下载geo非原始数
- 使用wget批量下载geo数据集的全部文件 linux下载geo数据 geo处理的数据不是下载原始数据 Linux如何下载ftp文件 geo ftp geo ftp下载 geo下载
- Linux【实操篇】—— 用户管理、linux系统root密码找回方式
- Linux防火墙——iptables实战操作
- Linux基础命令大全
- 使用wget批量下载geo数据集的全部文件 linux下载geo数据 geo处理的数据不是下载原始数据 Linux如何下载ftp文件 geo ftp geo ftp下载 geo下载