これは非常に単純化された例であるので、私はLinux上でこのコードを実行し、top
とメモリ消費量を見てみると、私は仮想で一定の増加を見るスレッドリークを中断するコードはなぜですか?
#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));
}
}
....一瞬私と一緒に負担してください使用されたメモリ(と私の実際のコードがある時点でクラッシュする)。スレッドを中断してスレッドに参加した場合に限り、メモリ使用量は一定のままです。何故ですか?
すべてのスレッドは、* real *スレッド関数の戻り値を格納するような、簿記のためのメモリを必要とします。スレッドに 'join 'しないと、そのメモリは決して再利用されません。 –
何らかの理由で@Someprogrammerdude私は、スレッドが 'thread_fun'で終了した場合、私が参加しているかどうかにかかわらず、きれいに終了するという印象を受けました。私はすでにそれが間違っていることを知っていますが、完全に理解していません。 – user463035818
@Someprogrammerdude offtopic for this questions:私はこの特定のスレッド(私は実際のコードでは1つを意味しますが、私のシステム内の他のどのスレッドよりもメモリがあります。私が知っている唯一の違いは、それを中断することですが、それは全く異なる質問になるでしょう... – user463035818