2017-10-05 10 views
2

これは非常に単純化された例であるので、私は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)); 
    } 
} 

....一瞬私と一緒に負担してください使用されたメモリ(と私の実際のコードがある時点でクラッシュする)。スレッドを中断してスレッドに参加した場合に限り、メモリ使用量は一定のままです。何故ですか?

+2

すべてのスレッドは、* real *スレッド関数の戻り値を格納するような、簿記のためのメモリを必要とします。スレッドに 'join 'しないと、そのメモリは決して再利用されません。 –

+0

何らかの理由で@Someprogrammerdude私は、スレッドが 'thread_fun'で終了した場合、私が参加しているかどうかにかかわらず、きれいに終了するという印象を受けました。私はすでにそれが間違っていることを知っていますが、完全に理解していません。 – user463035818

+0

@Someprogrammerdude offtopic for this questions:私はこの特定のスレッド(私は実際のコードでは1つを意味しますが、私のシステム内の他のどのスレッドよりもメモリがあります。私が知っている唯一の違いは、それを中断することですが、それは全く異なる質問になるでしょう... – user463035818

答えて

1

あなたはスレッドに参加していません。これにより、割り当てられたスレッドの状態を把握するために必要なリソースがあります。

結合されていないスレッドは、終了していても(たとえば、そのスレッドIDがまだ有効な場合など)いくつかのシステムリソースを引き続き使用します。 また、システムは、同時に割り当てられたスレッドの数に制限を課すことがあり、結合されていないスレッドはその制限に向かってカウントされます。 私のLinux VMにcat /proc/sys/kernel/threads-maxを使用すると、23207のスレッドが得られます。

ブーストの最新バージョンは、結合可能なスレッドオブジェクトを破壊すると実際にクラッシュするはずですが、古いバージョンは破壊要求に準拠しています。

関連する問題