【发布时间】:2015-04-12 05:07:24
【问题描述】:
我正在将 Boost 用于多生产者、单消费者队列,并希望消费者在 queue.empty() && [no more producers] 时退出。但是,确定何时不再有生产者并非易事。特别是,我想避免消费者可能认为没有更多生产者但确实存在的任何竞争条件。
想法:
引用计数:每个生产者在其第一个操作时增加引用计数,并在退出时减少它
检查每个线程是否正在运行,使用
joinable()
这两个主意都不好。
#1 存在以下问题:
- 引用计数必须是原子的(使用 Boost.Atomic 解决)
- 如果消费者在创建线程和增加引用计数之间签到会发生什么
- 偏执狂:如果线程意外终止并且无法减少其引用计数怎么办?
#2 存在以下问题:
-
joinable并不意味着没有终止(它可以自己完成但仍然是joinableboost::thread) - 消费者如何知道所有生产者线程是什么?即使用一个thread_group来保存它们,也没有办法枚举线程组,或者问“有没有可加入的?”
我认为这个问题可以使用监视器来解决,但我不知道该怎么做。
检测何时不再有生产者的标准方法是什么?如何使用 Boost 来完成?
【问题讨论】:
标签: c++ multithreading boost concurrency boost-thread