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++中分离线程的资源释放的主要内容,如果未能解决你的问题,请参考以下文章

CWinThread类,使用后要不要使用CloseHandle释放内核

C# kill线程正常释放资源?

是否可以防止zend引擎释放资源?

如何解决 C++ 中的未释放锁问题

可以同时等待和释放底层线程资源的线程间通信机制是啥

Java中有类似C++ 的delete ,free语句来释放资源吗