是在boost::thread_group终止时自动从中删除的boost:

Is a boost::thread automatically removed from a boost::thread_group when it terminates?

本文关键字:boost 删除 终止 thread group 是在      更新时间:2023-10-16

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

我对自己的";线程组";实现,并且没有更接近于解决甚至识别问题,我正在考虑只使用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...
}

如果是这样的话,那么我最初的整个has_threads实现只是一个破碎的克隆,我浪费了时间。:)

是的,对于这个片段来说,assert是一个非常糟糕的选择,因为我想它可能会导致任何不太可能的优秀线程在过去的count下屠杀内存?不管怎样,别介意


1-我一直在使用Boost 1.40,但最近版本的文档似乎是一样的。


更新

这个线程是一个例子,说明人们说的与我的测试结果相反。不过,如果是这样的话,它确实提供了一个不错的解决方案;thread_group是完全线程安全的,这很好(尽管我不相信shared_ptr::get()是线程安全的;如果线程在shared_ptr::reset完成之前结束呢?)。我需要使用此解决方案吗?

不,我没有抽象掉为我创建线程的任务调度程序,从而误解了测试结果。简而言之,我在错误的boost::thread_group上检查了size()

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