c++ - 无限循环不会浪费cpu资源吗?

标签 c++ multithreading boost lock-free busy-waiting

我打算使用 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/

相关文章:

c++ - 使用 boost::asio::spawn 生成的 asio 处理程序中的 boost::property_tree::read_xml 段错误

c++ - 灵气中可选解析器的使用

c++ - 将 thread::id 的 std::map 创建为整数值

c++ - 程序崩溃 - 除以 0

c++ - std::set<T>::insert,重复元素

Java - 线程问题

python - 在Thread中使用asyncio的问题

c++ - BOOST 正则表达式全局搜索行为

c++ - 如何从 C++ 文件中读取第一个数字

multithreading - TCP 分布式系统上的多路复用与多线程