我计划在我的多线程应用程序中使用推动::无锁::队列。boost示例演示了如下所示的无锁队列消耗:
boost::atomic<bool> done (false);
void consumer(void)
{
int value;
while (!done) {
while (queue.pop(value))
++consumer_count;
}
while (queue.pop(value))
++consumer_count;
}我的问题是这部分:
while (!done) {
//do something
}在这种情况下,我通常使用condition variable,但上述代码片段的简单性比查看条件变量的复杂性要诱人得多。
尽管consumer将有自己的线程,但它几乎在整个程序期间循环。我更担心的是,有很多次//do something部件没有被调用(队列是空的),并且这个线程浪费了大量的CPU时间,这些时间可以分配给其他线程。我说的对吗?这是一种常见的做法吗?
我需要有人告诉我我错了,我不应该为此担心&所以原因。或者建议我找个更好的方法。
谢谢
发布于 2014-08-04 09:44:42
对于对延迟敏感的应用程序来说,这是一种非常常见的做法,也就是不能接受唤醒线程所花费的时间的应用程序。
是的,在这种情况下(称为“旋转”),CPU时间被浪费在检查布尔值上。自旋锁也是以类似的方式实现的,因此在繁忙等待是首选的情况下,它们更可取。
当生产者到消费者路径的延迟不重要时,您应该选择条件变量(甚至显式睡眠)与其他线程/进程共享CPU。无论如何,当延迟非常重要时,您很少需要一个无锁容器(通常会暴露大量开销以避免锁定)。
发布于 2014-08-04 09:34:02
如果忙碌的等待比阻塞更有效率,则取决于平均等待时间。一些循环迭代可能比上下文切换更快。
使用无锁队列的要点是,它是无锁的.如果您想阻塞,最好像您建议的那样,在另一个队列中使用一个条件变量。
https://stackoverflow.com/questions/25115501
复制相似问题