gpt4 book ai didi

c++ - 为什么我的中断线程的代码会泄漏?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:08:02 25 4
gpt4 key购买 nike

这是一个非常简单的例子,所以请稍等片刻......

#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 查看内存消耗时,我发现使用的虚拟内存不断增加(并且我的实际代码有时会崩溃)。只有在中断线程后加入线程,内存使用率才会保持不变。这是为什么?

最佳答案

您没有加入线程:因此,跟踪线程所需的一些资源保持分配状态。

一个未加入的线程即使已经被终止,仍然使用一些系统资源(例如它的线程 ID 仍然有效)。此外,系统可能会对同时分配的线程数施加限制,并且未加入的线程将计入该限制。在我的 Linux VM 上使用 cat/proc/sys/kernel/threads-max 给我 23207 个线程。

当您销毁可连接的线程对象时,最新版本的 boost 实际上应该崩溃,而旧版本很乐意遵守销毁请求。

关于c++ - 为什么我的中断线程的代码会泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46580949/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com