【发布时间】:2014-08-04 09:27:24
【问题描述】:
我计划将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
}
我通常在这种情况下使用condition variable,但是上面代码sn-p的简单性远比条件变量的复杂性更诱人。
虽然consumer 有自己的线程,但它几乎在整个程序期间循环。我更担心,因为很多时候//do something 部分没有被调用(队列为空),并且很多可以分配给其他线程的 CPU 时间被这个线程浪费了。我对吗? THIS 是一种常见的做法吗?
我需要有人告诉我我错了,我不应该因为这样的原因而担心这个。 要么 建议我一个更好的方法。
谢谢
【问题讨论】:
-
该代码不是生产代码。它用于基准测试。
-
@KerrekSB 所以你不建议在这种情况下使用无限循环?
-
@rahman 这不是导致您所期望的问题的循环。事实上,在使用条件变量时,通常也需要循环来确保正确性。循环不等待锁是让忙等待变得浪费的原因。此外,它并不是真正的无限,因为它在
done为真时结束。 -
@rahman:“这种情况”是什么意思?如果你想对你的数据结构进行基准测试,那么代码是合适的。
-
@KerrekSB 不,我不是要进行基准测试。我真的要在我的应用程序中使用无锁功能。生产和消费之间的延迟并不重要。我只是不想在向这个队列发送数据时锁定线程。您也可以在接受的答案下方查看我的评论,并给我您的意见。谢谢
标签: c++ multithreading boost lock-free busy-waiting