gpt4 book ai didi

c++ - boost::thread 在终止时会自动从 boost::thread_group 中删除吗?

转载 作者:可可西里 更新时间:2023-11-01 16:41:13 25 4
gpt4 key购买 nike

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

我有 problems with my own "thread group" implementation ,并且没有更接近于解决甚至识别问题,我正在研究仅使用 boost::thread_grp

现在,从什么documentation I can find on the subject 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 对于这个片段来说是一个非常糟糕的选择,因为我猜它可能会导致任何不太可能的优秀线程在过去的内存下屠杀 计数?不管怎样,别管那个。


1 - 我卡在 Boost 1.40 上,但关于这个问题的文档似乎与更新的版本相同。


更新

This thread是人们所说的与我的测试所显示的相反的例子。不过,如果是这样的话,它确实也提供了一个不错的解决方案;很高兴 thread_group 是完全线程安全的(虽然我不相信 shared_ptr::get() 是线程安全的;如果线程在shared_ptr::reset 已完成?)。我需要使用这个解决方案吗?

最佳答案

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

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

关于c++ - boost::thread 在终止时会自动从 boost::thread_group 中删除吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9448076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com