Boost:如何确定是否还有任何生产者线程
Boost: How to determine if there are still any producer threads?
我对多生产者、单消费者队列使用Boost,并希望消费者在queue.empty() && [no more producers]
时退出。然而,确定何时不再有生产商并非易事。特别是,我想避免任何比赛条件下,消费者可能认为没有更多的生产商,但实际上有。
想法:
-
引用计数:每个生产者在第一次操作时增加一个引用计数,在退出时减少它
-
使用
joinable()
检查每个线程是否正在运行
这两个主意都不好。
#1存在以下问题:
- 引用计数必须是原子计数(使用Boost.atomic解决)
- 如果使用者在创建线程和递增引用计数之间进行检查,会发生什么
- 偏执狂:若线程异常终止,并且不能减少其引用计数,该怎么办
#2存在以下问题:
joinable
并不意味着没有终止(它可以自己完成,但仍然是joinable
boost::thread
)- 消费者如何知道所有生产者线程是什么?即使使用thread_group来容纳它们,也无法枚举线程组,也无法询问"有可连接的吗?">
我认为使用监视器可以解决这个问题,但我不确定如何做到这一点。
当没有更多的生产者时,检测的标准方法是什么?如何使用Boost实现这一点?
IMHO,第一个想法很好,问题是人为的。
如前所述,std::atomic
或boost::atomic
解决了第一个问题。
第二个问题是通过在线程构造函数调用之前增加引用计数,并在这两行之间进行适当的异常和错误处理(即producer_count++和c'tor调用)来解决的。
第三个问题。目前尚不清楚线程是如何意外终止的。我只能想象一个未处理的异常/信号。在未处理异常的情况下,会调用std::terminate
函数(std::thread-help,boost::thread help),无论是否递减引用计数器都无关紧要。我认为未处理Linux信号或Windows结构化异常的情况类似。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何在不产生任何垃圾的情况下获得C中的像素
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- C++映射有2个键,这样任何1个键都可以用来获取值
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- RtlCaptureStackBackTrace未捕获任何帧
- 链表c++插入,所有情况都已检查,但没有任何工作
- C++模板函数,用于比较任何无符号整数和有符号整数
- Arduino millis() - millis() 怎么能等于 0 以外的任何东西?
- 尝试摆脱任何堆内存分配
- 是否有任何C++功能可以对地图进行排序?
- 打印时有二叉树问题.用户输入不打印任何内容
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 在C++行尾写一个分号或多个分号是否会改变任何内容
- 消费者和生产者问题的双重缓冲
- C++类型特征,以查看是否可以<uint32_t>对类型"K"的任何变量调用"static_cast(k)"
- C++ 将 CIN 值存储到任何类型的数组中
- 为什么瓦尔格林德在不释放恶意内存后没有报告任何问题?
- Boost:如何确定是否还有任何生产者线程