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

时间:2017-10-05 08:19:59

标签: c++ multithreading boost interrupt

这是一个非常简单的例子,所以请耐心等待一下......

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

1 个答案:

答案 0 :(得分:1)

您没有加入该主题:因此,需要一些资源来跟踪线程的分配。

非连接线程仍然使用某些系统资源,即使它已被终止(例如,其线程ID仍然有效)。 此外,系统可以对同时分配的线程数施加限制,并且未连接的线程计入该限制。 在我的Linux VM上使用cat /proc/sys/kernel/threads-max为我提供了23207个线程。

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