5

スレッドがboost::thread_groupに追加されると、次のようになります。

boost::thread_group my_threads;
boost::thread *t = new boost::thread( &someFunc );
my_threads.add_thread(th);

my_threads作成されたすべてのboost::threadオブジェクトは、オブジェクトがスコープ外の場合にのみ削除されます。しかし、私のプログラムのメインスレッドは、実行中に多くのスレッドを生成します。したがって、約50スレッドがすでに実行されている場合、約1.5Gbのメモリがプログラムによって使用され、このメモリはメインプロセスの終了時にのみ解放されます。

問題は、スレッド関数が終了したときにこれらのboost :: threadオブジェクトを削除する方法ですか?!

4

1 に答える 1

6

このようにsthを実行することもできますが、同期に注意してください(確実でない限り、参照の代わりに共有ポインターを使用してboost :: thread_groupを使用することをお勧めします):

void someFunc(..., boost::thread_group & thg, boost::thread * thisTh)
{
  // do sth

  thg.remove_thread(thisThr);
  delete thisTh; // we coud do this as thread of execution and boost::thread object are quite independent
}

void run()
{
  boost::thread_group my_threads;
  boost::thread *t = new boost::thread(); // invalid handle, but we need some memory placeholder, so we could pass it to someFunc
  *t = boot::thread(
    boost::bind(&someFunc, boost::ref(my_threads), t)
  );
  my_threads.add_thread(t);
  // do not call join
}

at_thread_exit()関数を確認することもできます。

とにかく、boost::threadオブジェクトの重みは30MBであってはなりません。

于 2012-05-21T10:32:46.317 に答える