首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无限循环不会浪费cpu资源吗?

无限循环不会浪费cpu资源吗?
EN

Stack Overflow用户
提问于 2014-08-04 09:27:24
回答 2查看 893关注 0票数 1

我计划在我的多线程应用程序中使用推动::无锁::队列boost示例演示了如下所示的无锁队列消耗:

代码语言:javascript
复制
boost::atomic<bool> done (false);
void consumer(void)
{
    int value;
    while (!done) {
        while (queue.pop(value))
            ++consumer_count;
    }

    while (queue.pop(value))
        ++consumer_count;
}

我的问题是这部分:

代码语言:javascript
复制
    while (!done) {
    //do something
    }

在这种情况下,我通常使用condition variable,但上述代码片段的简单性比查看条件变量的复杂性要诱人得多。

尽管consumer将有自己的线程,但它几乎在整个程序期间循环。我更担心的是,有很多次//do something部件没有被调用(队列是空的),并且这个线程浪费了大量的CPU时间,这些时间可以分配给其他线程。我说的对吗?是一种常见的做法吗?

我需要有人告诉我我错了,我不应该为此担心&所以原因。或者建议我找个更好的方法。

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-04 09:44:42

对于对延迟敏感的应用程序来说,这是一种非常常见的做法,也就是不能接受唤醒线程所花费的时间的应用程序。

是的,在这种情况下(称为“旋转”),CPU时间被浪费在检查布尔值上。自旋锁也是以类似的方式实现的,因此在繁忙等待是首选的情况下,它们更可取。

当生产者到消费者路径的延迟不重要时,您应该选择条件变量(甚至显式睡眠)与其他线程/进程共享CPU。无论如何,当延迟非常重要时,您很少需要一个无锁容器(通常会暴露大量开销以避免锁定)。

票数 2
EN

Stack Overflow用户

发布于 2014-08-04 09:34:02

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

使用无锁队列的要点是,它是无锁的.如果您想阻塞,最好像您建议的那样,在另一个队列中使用一个条件变量。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25115501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档