【发布时间】:2014-02-20 07:16:06
【问题描述】:
我有一个 C++11 应用程序,它有一个高优先级线程正在生成数据,还有一个低优先级线程正在使用它(在我的例子中,将它写入磁盘)。我想确保高优先级生产者线程永远不会被阻塞,即它只使用无锁算法。
使用无锁队列,我可以将数据从生产者线程推送到队列,并从消费者线程进行轮询,从而实现上述目标。我想修改我的程序,以便消费者线程在不活动时阻塞而不是轮询。
C++11 条件变量似乎对阻塞消费者线程很有用。谁能告诉我一个如何使用它的例子,同时避免消费者睡觉时数据仍在队列中的可能性?更具体地说,我想确保在生产者将最后一个项目推入队列后,消费者总是在有限的时间内被唤醒。生产者保持非阻塞状态也很重要。
【问题讨论】:
-
查看codereview.stackexchange.com/questions/39199/…中条件变量的使用示例
-
使用条件变量完全无锁是不可能的,因为要等待或发出信号,您必须获得锁。但实际上这并没有真正的区别(大多数锁都会有一个短暂的繁忙等待策略,这应该足以避免任何内核调用或其他原因,因为读者的关键部分非常短)
-
@Voo 不需要获取锁来表示条件变量。
-
@Voo Waiting 条件变量需要锁定,signaling 不需要。
-
@Casey 你有没有看到文档说明条件变量的信号是非阻塞的?我也这么认为,但我从来没有在任何地方找到明确的确认。
标签: multithreading c++11 producer-consumer