避免无限循环浪费CPU资源

wont infinite loop waste cpu resource?

本文关键字:CPU 资源 无限循环      更新时间:2023-10-16

我计划在我的多线程应用程序中使用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。无论如何,当延迟至关重要时,您很少希望使用无锁容器(这通常会暴露出避免锁定的巨大开销)

忙等待是否比阻塞更有效率取决于你平均等待的时间。一些循环迭代可能比上下文切换更快。

使用无锁队列的关键在于它是无锁的。如果你想阻塞,你最好使用一个条件变量,正如你所建议的,与另一个队列。