避免无限循环浪费CPU资源
wont infinite loop waste cpu resource?
我计划在我的多线程应用程序中使用boost::lockfree::queue。一个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时间,这可以给其他线程,被这个线程浪费。我说的对吗?这是常见的做法吗?
我需要有人告诉我我错了,我不应该为此担心这么多理由。或建议我一个更好的方法。
谢谢
对于延迟敏感的应用程序,即唤醒线程所花费的时间是不可接受的,这是一种非常常见的做法。
是的,在这种情况下(它被称为"旋转"),CPU时间浪费在检查布尔值上。自旋锁以类似的方式实现,使其在首选忙等待的场景中更可取。
当生产者到消费者路径的延迟不是关键时,您应该选择条件变量(甚至显式睡眠)与其他线程/进程共享CPU。无论如何,当延迟至关重要时,您很少希望使用无锁容器(这通常会暴露出避免锁定的巨大开销)
忙等待是否比阻塞更有效率取决于你平均等待的时间。一些循环迭代可能比上下文切换更快。
使用无锁队列的关键在于它是无锁的。如果你想阻塞,你最好使用一个条件变量,正如你所建议的,与另一个队列。
相关文章:
- 具有瞬态资源的RAII类
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 允许从 std::map 的密钥窃取资源?
- 参考资源文件VC++中的$(SolutionDir)
- 如何维护资源管理器项目视图中当前可见的项目列表
- 将 std::allocate_shared 与多态资源分配器一起使用
- 使用RAII在给定次数的迭代后重新分配资源
- 资源管理设计模式
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- 如何跨平台将二进制资源构建到程序中?
- 编写一个函数以使用 n 百分比的 CPU 使用率
- 如何禁用 CPU 的无序执行
- SetDlgItemInt 不会更改嵌入资源的编辑框
- Klocwork Inside的资源泄漏
- 从存储为 Windows 资源 (c++) 的 png 中获取 png 文件数据
- 线程池正在占用所有CPU资源
- 基本服务器占用大量CPU资源-如何减轻
- 避免无限循环浪费CPU资源
- UDP接收线程占用太多CPU资源