C ++中Detach线程的资源释放

时间:2016-11-01 09:39:57

标签: c++ multithreading c++11 stdthread detach

我正在浏览堆栈溢出的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;
}

那么为什么在堆栈溢出的很多帖子中都表明即使主线程退出,分离线程仍在后台继续运行?在什么条件下,当主要退出以及上述哪一个陈述为真时,分离线程继续在后台运行?

提前致谢。

1 个答案:

答案 0 :(得分:0)

标准将线程的范围定义为程序:

  

1.10 / 1:执行线程(也称为线程)是一个单一的控制流程序中(...)执行整个程序包含所有线程的执行。

标准说明了分离的线程:

  

30.3.3 / 1:当没有线程对象代表该线程时,将分离执行线程。

因此标准中没有任何内容表明线程可以在其程序中存活。

如果你想在程序结束后保留​​一些在后台运行的东西,你必须分叉或创建一个单独的进程,该进程将在后台运行并拥有自己的资源和线程。