我打算使用 boost::lockfree::queue对于我的多线程应用程序。 boost example像这样说明无锁队列消耗:
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
}
在这种情况下,我通常使用条件变量
,但上面代码片段的简单性远比经历条件变量的复杂性更诱人。
尽管消费者
有自己的线程,但它几乎在整个程序运行期间都在循环。我更担心的是因为有很多次 //do something
部分没有被调用(队列是空的)并且这个线程浪费了很多可以给其他线程的 CPU 时间.我对吗?是THIS常见做法?
我需要有人告诉我我错了,我不应该因为某某原因而为此担心。 或者 给我一个更好的方法。
谢谢
最佳答案
对于延迟敏感的应用程序来说,这是一种非常常见的做法,即唤醒线程所花费的时间是 Not Acceptable 应用程序。
是的,在那种情况下(称为“自旋”),CPU 时间被浪费在检查 bool 值上。 Spinlocks以类似的方式实现,使它们更适用于需要忙碌等待的场景。
当生产者到消费者路径的延迟不重要时,您应该更喜欢条件变量(甚至显式休眠)以与其他线程/进程共享 CPU。而且无论如何,当延迟很关键时,您很少需要无锁容器(这通常会暴露大量开销以避免锁定)
关于c++ - 无限循环不会浪费cpu资源吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25115501/