【发布时间】:2017-10-05 08:19:59
【问题描述】:
这是一个非常简单的例子,所以请稍等片刻......
#include <boost/thread/thread.hpp>
struct foo {
boost::thread t;
void do_something() { std::cout << "foo\n"; }
void thread_fun(){
try {
boost::this_thread::sleep(boost::posix_time::seconds(2));
{
boost::this_thread::disable_interruption di;
do_something();
}
} catch (boost::thread_interrupted& e) {}
}
void interrupt_and_restart() {
t.interrupt();
//if (t.joinable()) t.join(); // X
t = boost::thread(&foo::thread_fun,this);
}
};
int main(){
foo f;
for (int i=0;i<1000;i++){
f.interrupt_and_restart();
boost::this_thread::sleep(boost::posix_time::seconds(3));
}
}
当我在 linux 上运行此代码并使用 top 查看内存消耗时,我看到使用的虚拟内存不断增加(并且我的实际代码有时会崩溃)。只有当我在中断线程后加入线程时,内存使用量才会保持不变。这是为什么?
【问题讨论】:
-
所有线程都需要一些内存来记账(比如存储 real 线程函数的返回值)。如果您不
join线程,则该内存将永远不会被回收。 -
@Someprogrammerdude 出于某种原因,我的印象是,如果线程以
thread_fun结束,无论我是否加入,它都会干净地终止。我已经知道错了,但不完全理解 -
@Someprogrammerdude 这个问题的题外话:我还观察到这个特定线程(我的意思是真实代码中的那个,但它看起来很相似)令我惊讶的是,它使用的内存比任何其他线程都多我的系统和我知道的唯一区别是我中断了它,但那将是一个完全不同的问题......
-
@user5226582 您链接的问题是关于 C# 的。是的,只有睡眠应该被打断,而不是实际工作(调用
doSomething)
标签: c++ multithreading boost interrupt