while(true)vs wait + condition synchronism

时间:2011-07-29 08:51:05

标签: c++ multithreading

将线程放入while(true)循环并测试条件是否可以开始治疗是不好的做法?

void run()
{
    for(;;)
    {
        if(dataReady)
        {
            processData();
        }
    }
}

最好使用等待/条件机制:

void run()
{
    for(;;)
    {
        if(dataReady)
        {
            processData();
        }
        lock_guard lock(mutex);
        condition_.wait(lock);
    }
}

另一个主题当然是调用condition_.notify_one()

编辑:

我希望几乎不会等待。

6 个答案:

答案 0 :(得分:7)

虽然真实是一种糟糕的方式,因为它只是吃了处理周期 第二种方法更好,只有在必须执行某些工作时线程才会被暗示。

答案 1 :(得分:4)

这取决于您期望等待的时间。

在非常短的时间内,忙碌等待可能更可取,因为它不会将上下文切换作为另一种技术。上下文切换的开销有时可能会超过整个忙等待循环。

答案 2 :(得分:2)

如果您这样做,第一种方式是您需要确保编译器实际从内存中读取变量并且不会优化内存中的读取,因为值不能在该循环内部进行更改。将变量声明为" volatile"这是必要的。

但是它自己的还不够。您需要某种形式的内存屏障来确保一个线程中变量的更改对另一个线程可见,并且存储和读取不会被CPU和缓存重新排序。如果这是在x86上你可能会在没有它的情况下逃脱。但是如果你想做这种事情,你可以更好地使用编译器内在函数,例如InterlockedIncrement(在Windows上,或者在其他平台上类似)。

对于几乎所有情况,您最好使用条件变量或来自库的自旋锁(这实际上是您尝试实现的),因为他们将获得有关多核处理的详细信息

答案 3 :(得分:0)

总是建议做后者。 但是这是任何线程或并发论文中的基本问题......

在旧处理器中,只有一个线程,无论处理器在做什么都消耗了电源,这是等待事情的常用习惯。现在处理器有几个可以推进的线程,而且它们足够聪明,如果你只是等待条件就不会消耗电力。

答案 4 :(得分:0)

前者通常是一个糟糕的主意,因为你将在一个核心无所事事上使用100%的CPU。你会占用一些其他线程可能已经使用的资源(可能是那个应该设置dataready的线程。

在第二个示例中,线程被置于保持状态,直到通知为止。所以它不占用CPU时间。

答案 5 :(得分:0)

是的,这是不好的做法。繁忙的循环只是在没有锁和线程等复杂结构的地方才是合法的设计选择。

虽然,如果您可以保证您的软件是设备上运行的唯一应用程序(可能是嵌入式项目中的情况),您可以采用繁忙的循环。

但总的来说,请避免使用它们。

相关问题