是在boost::thread_group终止时自动从中删除的boost:
Is a boost::thread automatically removed from a boost::thread_group when it terminates?
(这个问题虽然相似,但并没有真正回答我的问题。)
我对自己的";线程组";实现,并且没有更接近于解决甚至识别问题,我正在考虑只使用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()
不会自行关闭,所以我将使用我在问题更新中链接到的论坛帖子中提供的解决方案的改编版本。
- 如何使用 Boost Hana 删除元编程递归
- 如果是双重注册,如何从Boost树中删除孩子
- 无法从boost multi_index_container 中删除元素
- add_month从 boost::gregorian 中删除
- 如何确保 boost::文件系统::remove 不会尝试删除由其他进程使用的文件
- 使用Boost Hana从打字员中删除重复的统一方法
- 尽管使用了 boost::scoped_ptr,我们是否应该删除析构函数中成员的指针
- 从 Boost::Tokenizer 中删除重复项
- 删除boost ::线程后代
- 如何使用 boost 的 ptree 删除 XML 的属性?
- 预处理一个自定义文本文件,以使用Boost Spirit删除注释
- boost ::线程在删除可加入线程时存在什么问题
- 使用迭代器从Boost多指数中删除项目时的一致性
- 如何知道 boost::interprocess::message_queue 已从系统中删除
- 在链接到使用 cmake 的 boost 库时删除 boost 依赖项
- 从 boost::fibonacci_heap 中删除元素时会发生什么
- 为什么 boost::fusion::as_set 从 boost::fusion::vector 中删除重复项?
- 从Boost Graph中删除多个顶点
- Boost.Tokenizer如何不从令牌中删除分隔符
- 删除boost::python暴露的std::vector中的指针