【问题标题】:Boost: How to determine if there are still any producer threads?Boost:如何判断是否还有生产者线程?
【发布时间】:2015-04-12 05:07:24
【问题描述】:

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

想法:

  1. 引用计数:每个生产者在其第一个操作时增加引用计数,并在退出时减少它

  2. 检查每个线程是否正在运行,使用joinable()

这两个主意都不好。

#1 存在以下问题:

  • 引用计数必须是原子的(使用 Boost.Atomic 解决)
  • 如果消费者在创建线程和增加引用计数之间签到会发生什么
  • 偏执狂:如果线程意外终止并且无法减少其引用计数怎么办?

#2 存在以下问题:

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

我认为这个问题可以使用监视器来解决,但我不知道该怎么做。

检测何时不再有生产者的标准方法是什么?如何使用 Boost 来完成?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2010-12-30
      • 2012-10-13
      • 2011-02-09
      • 2011-02-24
      • 1970-01-01
      • 2017-04-01
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多