【发布时间】:2009-09-28 20:39:27
【问题描述】:
我正在使用 C++ 和 Boost 开发一个多线程程序。我正在使用辅助线程来急切地异步初始化资源。如果我分离线程并且对线程的所有引用超出范围,我是否泄漏了任何资源?或者线程是否在自身之后进行清理(即它的堆栈和自身所需的任何其他系统资源)?
根据我在文档中看到的内容(以及我 8 年前从 pthreads 中看到的内容),不需要进行明确的“破坏线程”调用。
我希望线程异步执行,当需要使用资源时,我会检查是否发生错误。粗略的代码如下所示:
//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 秒后清理干净,但我想绝对确定。
【问题讨论】:
-
我真的不明白你的问题:线程堆栈上的东西当然会在退出线程入口函数时被清理干净。堆上的东西或任何资源当然不会在线程退出时被释放。 Boosts 线程对象当然应该在线程退出时自行删除 - 否则这对我来说没有意义。
-
基本上,我想确保没有我应该调用的“破坏线程”方法被我忽略了。
标签: c++ windows multithreading mfc posix