C++中分离线程的资源释放
Posted
技术标签:
【中文标题】C++中分离线程的资源释放【英文标题】:Resource deallocation for Detach thread in C++ 【发布时间】:2016-11-01 09:39:56 【问题描述】:我正在查看 this 关于堆栈溢出的帖子,其中接受的答案是:
what happens to a detached thread when main() exits is:
It continues running (because the standard doesn't say it is stopped), and that's well-defined, as long as it touches neither (automatic|thread_local) variables of other threads nor static objects.
虽然在this 的帖子中接受的答案是这样的:
Process terminates when main() exits, and all threads are killed.
为了查看行为,我在 g++ (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4 上测试了下面的代码,这表明一旦主线程退出,其他分离线程也会退出。
#include <iostream>
#include <thread>
#include <unistd.h>
#include <fstream>
using namespace std;
void foo()
std::cout<<"Inside foo\n";
int i=0;
ofstream myfile;
while(i<10)
std::cout<<"Inside while\n";
myfile.open ("/home/abc/example.txt",ios::app);
myfile << "Writing this to a file.\n";
myfile.close();
i++;
sleep(1);
int main()
std::thread first (foo);
first.detach();
sleep(5);
return 0;
那么,为什么在许多关于堆栈溢出的帖子中,即使主线程退出,分离线程也会继续在后台运行?什么情况下分离线程在主退出时继续在后台运行,上面哪一个是正确的?
提前致谢。
【问题讨论】:
您应该阅读关于您的第一个链接的已接受答案的评论。当main()
退出时,分离的线程将不复存在。
当一个进程结束时,所有与该进程相关的线程都会被清理掉。
@πάνταῥεῖ 我的错。我错过了阅读有关该答案的评论。感谢您指出。
【参考方案1】:
标准将线程的范围定义为程序:
1.10/1:执行线程(也称为线程)是在程序中的单个控制流(...)整个程序由其所有线程的执行组成。
标准说的是分离线程:
30.3.3/1:当没有线程对象代表该线程时,执行线程被分离。
因此,标准中没有任何内容表明线程可以在其程序中生存。
如果您想在程序结束后保持某些东西在后台运行,您必须派生或创建一个单独的进程,该进程将使用自己的资源和线程在后台运行。
【讨论】:
以上是关于C++中分离线程的资源释放的主要内容,如果未能解决你的问题,请参考以下文章