我需要设置一个生产者-消费者方案,其中两个线程由一个队列链接(生产者将任务推入队列,消费者在任务出现时执行任务)。
由于队列大部分时间都是空的,所以我必须做好它,这样使用者线程就可以在出厂者一推出什么东西时就睡觉并被唤醒。然而,我必须确保制片人永远不会被封杀,即使是在短期内。换句话说,我需要一些单边阻塞队列。
这里有无锁队列,但是根据定义,这些队列是免费的,因此它们不可能阻止使用者线程。
我已经考虑过将一个无锁队列与一个条件变量关联起来。当使用者线程发现队列为空时,它将处于休眠状态,等待通知条件。当将任务推入队列时,生产者线程会通知条件,唤醒使用者线程(如果它正在休眠)。但是,条件变量必须由互斥保护,这意味着在试图获取生成器线程通知条件时,仍然有很小的机会阻止它。
我还没有找到一个真正好的方法来解决这个问题,所以你的想法更受欢迎。
注意:我计划使用boost线程来实现这一点。
注2:我不考虑生产者试图推送某个东西而队列已满的情况。这是永远不会发生的。
发布于 2014-08-23 07:00:50
tbb库提供 --阻塞队列和非阻塞队列:
try_pop()和push()。push(),如果指定了容量限制并在达到此限制时可以阻塞;而pop()则提供在空队列中等待项。它还为同一队列提供了非阻塞的try_push()和try_pop()替代方案。https://stackoverflow.com/questions/25456427
复制相似问题