等待条件变量加载CPU核心?

时间:2017-01-27 17:50:17

标签: c++ multithreading

等待条件变量是否导致循环使用指令将CPU内核加载到100%?这就是等待cvar的方法通常是在C ++中完成的:

void worker_thread()
{
    // Wait until ready turns true and the condition variable is notified
    std::unique_lock<std::mutex> lk(m);
    cv.wait(lk, []{return ready;}); //<-- does this load the cpu?
    // Do something
}

我认为这样的事情是基础实现:

while (1)
{
    lock mutex;
    if (condition) signal();
    unlock mutex;
}

此代码会将运行的处理器核心加载到100%,因为没有Sleep()。

现实中会发生什么?

4 个答案:

答案 0 :(得分:1)

在我使用过的任何编译器和操作系统中都没有。通常,同步原语的底层操作作为内核调用执行,除非它是显式声明的,并且OS的内核关心它是如何执行的。即使它不在标准中,我认为它只是允许符合C ++标准的编译器存在于异国情调的架构中。除非你使用的东西非常罕见且具体,否则你不应该关心它。

答案 1 :(得分:1)

一般来说,这个逻辑围绕着implementation of scheduler in OS

等待和唤醒线程的功能是与OS的调度程序一起完成的。

通用/简单设计: In the mentioned scenario,wait将导致线程休眠,因此调度程序应将线程从运行状态(运行队列)移动到等待/阻塞状态(等待队列),除非满足特定条件。因此,通常在这种情况下,可能没有CPU周期消耗。

一旦满足条件,信号量就会调度调度程序,以便调度程序可以唤醒等待条件并调度它的线程(也就是说,它应该将线程从等待/阻塞状态移动(等待队列) )运行状态(运行队列)并安排它。)

答案 2 :(得分:0)

就我而言(这就是我找到您问题的方式),问题在于未为编译器和链接器指定-pthread。是的,所有编译和链接都没有该标志,但是CPU使用率为100%。

答案 3 :(得分:0)

就我而言,我已经配置了我的应用程序,似乎在等待中消耗大量CPU,仅在等待时占用了30%的CPU。这是很多CPU,因为我正在运行的应用程序是一个完整的游戏,具有1000次重绘图调用和粒子系统计算。在我的iOS上,等待发生在__psynch_cvwait上。