提升:如何确定是否还有生产者线程?

时间:2015-04-12 05:07:25

标签: c++ multithreading boost concurrency boost-thread

我正在将Boost用于多生产者,单用户队列,并希望消费者在queue.empty() && [no more producers]时退出。然而,确定什么时候没有更多的生产者是非平凡的。特别是,我想避免任何竞争条件,消费者可能认为没有更多的生产者,但确实存在。

的想法:

  1. 引用计数:每个生成器将引用计数作为其第一个操作递增,并在退出时递减它

  2. 使用joinable()

  3. 检查每个帖子是否正在运行

    这两个想法都不好。

    #1遇到这些问题:

    • 引用计数必须是原子的(使用Boost.Atomic解决)
    • 如果消费者在创建线程和递增引用计数之间进行检查会发生什么
    • 偏执狂:如果线程无意中终止并且无法判断其引用次数会怎么样?

    #2遇到这些问题:

    • joinable并不意味着没有终止(它可以自己完成但仍然是joinable boost::thread
    • 消费者如何知道所有生产者线程是什么?即使使用thread_group来保存它们,也无法枚举线程组,或者询问“是否可以连接?”

    我认为使用显示器可以解决问题,但我不知道该怎么做。

    什么是检测何时没有生产者的标准方法,以及如何使用Boost完成?

1 个答案:

答案 0 :(得分:0)

恕我直言,第一个想法是好的,问题是人为的。

如前所述,std::atomicboost::atomic解决了第一个问题。

第二个问题是通过在线程构造函数调用之前递增引用计数以及在这两行之间进行适当的异常和错误处理来解决的(即producer_count ++和c' tor call)。

第3个问题。目前尚不清楚线程是如何被意外终止的。我只能想象一下未处理的异常/信号。如果未处理异常,则调用std::terminate函数(std::thread helpboost::thread help),并且无论参考计数器是否递减都无关紧要。我认为没有处理Linux信号或Windows结构化异常的情况类似。