线程在Win32 / MFC和POSIX中自行清理吗?

时间:2009-09-28 20:39:28

标签: c++ windows multithreading mfc posix

我正在使用C ++和Boost开发多线程程序。我正在使用一个辅助线程来急切地初始化资源。如果我分离线程并且对线程的所有引用超出范围,我是否泄漏了任何资源?或者线程是否自行清理(即它的堆栈和自身所需的任何其他系统资源)?

从我在文档中看到的内容(以及我从8年前的pthreads中回忆起来的内容)来看,没有明确的“destory thread”调用需要进行。

我希望线程以异步方式执行,当需要使用资源时,我会检查是否发生了错误。粗略的代码看起来像:

//Assume this won't get called frequently enough that next_resource won't get promoted
//before the thread finishes.
PromoteResource() {
   current_resource_ptr = next_resource_ptr;
   next_resource_ptr.reset(new Resource());
   callable = bind(Resource::Initialize, next_resource); //not correct syntax, but I hope it's clear
   boost::thread t(callable);
   t.start();
}

当然 - 我理解正常的内存处理问题仍然存在(忘记删除,错误的异常处理等)......我只需要确认线程本身不是“泄漏”。

编辑:澄清一点,我想确保这在技术上不是泄漏:

void Run() {
   sleep(10 seconds);
}

void DoSomething(...) {
   thread t(Run);
   t.run();
} //thread detaches, will clean itself up--the thread itself isn't a 'leak'?

我相当确定10秒后所有东西都被清理干净了,但我想绝对肯定。

4 个答案:

答案 0 :(得分:2)

线程的堆栈在退出时会被清除,但不会被清除。这意味着它在堆上或其他任何地方(例如,在预先存在的数据结构中)分配的任何内容在退出时都会离开。

此外,任何操作系统级别的对象(文件句柄,套接字等)都将被放置(除非您使用的是在其析构函数中关闭它们的包装器对象)。

但经常创建/销毁线程的程序可能大部分都会释放它们在同一个线程中分配的所有东西,因为这是保持程序员理智的唯一方法。

答案 1 :(得分:1)

如果我没弄错,在Windows Xp上,当进程终止时,进程使用的所有资源都将被释放,但对于线程则不然。

答案 2 :(得分:1)

是的,资源会在线程终止时自动释放。这是一个完全正常和可接受的事情来做一个后台线程。

要在线程之后进行清理,您必须将其连接或分离(在这种情况下,您无法再加入它)。

这是来自增强线程文档的引用,它有点解释了(但不完全是)。

  

当boost :: thread对象时   表示执行的线程是   破坏了线程变得分离。   一旦线程被分离,它就会   继续执行直到   调用函数或可调用   施工提供的物体有   完成,或程序是   终止。线程也可以   通过显式调用来分离   detach()成员函数   boost :: thread对象。在这种情况下,   boost :: thread对象停止了   代表现在分离的线程,和   而是代表非线程。

     

为了等待一个帖子   执行完成,join()或   timed_join()的成员函数   必须使用boost :: thread对象。   join()将阻止调用线程   直到代表的线程   boost :: thread对象已经完成。如果   由...表示的执行线程   boost :: thread对象已经存在   完成,或者boost :: thread对象   表示非线程,然后join()   马上回来。 timed_join()是   类似的,除了打电话给   timed_join()也会返回   正在等待的线程没有   在指定时间内完成   过去。

答案 3 :(得分:1)

在Win32中,只要文档中名为ThreadProc的线程主函数完成,线程就会被清除。当然,您需要在ThreadProc内分配的任何资源都需要明确清理。