我正在将Boost用于多生产者,单用户队列,并希望消费者在queue.empty() && [no more producers]
时退出。然而,确定什么时候没有更多的生产者是非平凡的。特别是,我想避免任何竞争条件,消费者可能认为没有更多的生产者,但确实存在。
引用计数:每个生成器将引用计数作为其第一个操作递增,并在退出时递减它
使用joinable()
这两个想法都不好。
joinable
并不意味着没有终止(它可以自己完成但仍然是joinable
boost::thread
)我认为使用显示器可以解决问题,但我不知道该怎么做。
什么是检测何时没有生产者的标准方法,以及如何使用Boost完成?
答案 0 :(得分:0)
如前所述,std::atomic
或boost::atomic
解决了第一个问题。
第二个问题是通过在线程构造函数调用之前递增引用计数以及在这两行之间进行适当的异常和错误处理来解决的(即producer_count ++和c' tor call)。
第3个问题。目前尚不清楚线程是如何被意外终止的。我只能想象一下未处理的异常/信号。如果未处理异常,则调用std::terminate
函数(std::thread help,boost::thread help),并且无论参考计数器是否递减都无关紧要。我认为没有处理Linux信号或Windows结构化异常的情况类似。