当boost :: thread_group终止时,它是否会自动从boost :: thread_group中删除?

Lig*_*ica 9 c++ multithreading boost boost-thread

(这个问题虽然相似,但并没有真正回答我的问题.)

我在自己的"线程组"实现方面遇到了问题,并且没有更接近解决甚至找出问题,我正在考虑使用boost::thread_grp.

现在,根据我在主题1 上可以找到的文档,我一直认为线程对象 - 无论其实际工作的持续时间 - 仍然存在并且是线程组的一部分,直到线程组被销毁.

但是,粗略的测试似乎表明,boost::thread_group::size()当线程完成其工作并终止时,它自己会减少.这意味着线程对象本身也正在为我清理.

这是真的?我可以依靠它吗?

#include <cassert>
#include <unistd.h>         // for sleep()
#include <boost/thread.hpp>

boost::mutex m;
unsigned int count = 0;

void func() {
   boost::mutex::scoped_lock l(m);
   count++;
}

int main()
{
   boost::thread_group grp;
   for (size_t i = 0; i < 300; i++)
      grp.create_thread(func());

   sleep(10);

   assert(count == 300);
   assert(grp.size() == 0);  // passes, in my tests

   // ^ Can I rely on that?
   //   Do I really have no thread objects eating up
   //     memory, at this point?

   grp.join_all();
   // ^ Then I guess this is doing nothing, in this case...
}
Run Code Online (Sandbox Code Playgroud)

如果是,那么我的整个原始has_threads实现只是一个破碎的克隆,我浪费了我的时间.:)

并且,是的,assert对于这个片段来说,这是一个非常糟糕的选择,因为我猜它可能会导致任何不太可能的优秀线程在以前的内存中剔除内存count?无论如何,没关系.


1 - 我坚持使用Boost 1.40,但关于此事的文档似乎与更新的版本相同.


更新

这个帖子就是一个例子,人们说的是与我的测试结果相反的地方.如果是这样的话,它也提供了一个不错的解决方案; 它thread_group是完全线程安全的很好(虽然我不相信这shared_ptr::get()是线程安全的;如果线程在shared_ptr::reset完成之前结束了怎么办?).我需要使用这个解决方案吗?

Lig*_*ica 4

不,我误解了测试结果,因为我没有抽象出为我创建线程的任务调度程序。总之,我检查size()错了boost::thread_group

事实上,当线程终止时,它boost::thread_group::size() 不会自行下降,因此我将使用我在问题更新中链接到的论坛帖子中提供的解决方案的改编版本。