这是一个非常简单的例子,所以请耐心等待一下......
#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
查看内存消耗时,我看到所使用的虚拟内存不断增加(并且我的实际代码在某些时候崩溃)。只有在中断后加入线程,内存使用率才会保持不变。这是为什么?
答案 0 :(得分:1)
您没有加入该主题:因此,需要一些资源来跟踪线程的分配。
非连接线程仍然使用某些系统资源,即使它已被终止(例如,其线程ID仍然有效)。
此外,系统可以对同时分配的线程数施加限制,并且未连接的线程计入该限制。
在我的Linux VM上使用cat /proc/sys/kernel/threads-max
为我提供了23207个线程。
当您销毁可连接的线程对象时,最新版本的boost实际上会崩溃,而旧版本很乐意遵守销毁请求。