Boost:如何确定是否还有任何生产者线程

Boost: How to determine if there are still any producer threads?

本文关键字:任何 生产者 线程 是否 何确定 Boost      更新时间:2023-10-16

我对多生产者、单消费者队列使用Boost,并希望消费者在queue.empty() && [no more producers]时退出。然而,确定何时不再有生产商并非易事。特别是,我想避免任何比赛条件下,消费者可能认为没有更多的生产商,但实际上有。

想法:

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

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

这两个主意都不好。

#1存在以下问题:

  • 引用计数必须是原子计数(使用Boost.atomic解决)
  • 如果使用者在创建线程和递增引用计数之间进行检查,会发生什么
  • 偏执狂:若线程异常终止,并且不能减少其引用计数,该怎么办

#2存在以下问题:

  • joinable并不意味着没有终止(它可以自己完成,但仍然是joinableboost::thread)
  • 消费者如何知道所有生产者线程是什么?即使使用thread_group来容纳它们,也无法枚举线程组,也无法询问"有可连接的吗?">

我认为使用监视器可以解决这个问题,但我不确定如何做到这一点。

当没有更多的生产者时,检测的标准方法是什么?如何使用Boost实现这一点?

IMHO,第一个想法很好,问题是人为的。

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

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

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