我需要设置一个生产者 - 消费者方案,其中两个线程由一个队列链接(生产者将任务推入队列,消费者在它们来时执行它们)。
由于队列在大多数情况下都是空的,所以我必须使它成为消费者线程可以睡觉并在生产者推动某些东西后立即被唤醒。但是,我必须确保生产者永远不会被阻止,甚至不会很快。换句话说,我需要一些单边阻塞队列。
有无锁队列,但由于这些是定义的,好吧,无锁,因此消费者线程不可能被它们阻止。
我想过将无锁队列与条件变量相关联。当消费者线程发现队列为空时,它将睡眠等待通知条件。生产者线程在将任务推入唤醒消费者线程的队列(如果它正在休眠)时会通知条件。但是,条件变量必须受互斥锁保护,这意味着在尝试获取生成器线程以通知条件时,生产者线程仍有很小的机会被阻止。
我还没有找到一个解决这个问题的好方法,所以你的想法更受欢迎。
注意:我打算使用boost线程来实现它。
注2:我没有考虑生产者试图推送东西并且队列已满的情况。这永远不会发生。
答案 0 :(得分:1)
try_pop()
和push()
无限增长。push()
,如果指定了容量限制并且达到了容量限制,则可以阻止该问题;和pop()
等待空队列中的项目。它还为同一队列提供了非阻塞try_push()
和try_pop()
替代方案。