等待条件变量是否会加载 CPU 内核

Does waiting on a condition variable load the CPU core?

本文关键字:加载 CPU 内核 是否 条件 变量 等待      更新时间:2023-10-16

等待条件变量是否会导致循环通过指令将 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()。

现实中会发生什么?

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

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

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

等待和唤醒线程的功能是与操作系统的调度程序合作完成的。

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

满足条件后,信号量将提示调度程序,

以便调度程序可以唤醒正在等待条件的线程并调度它(即,它应将线程从等待/阻塞状态(等待队列)移动到运行状态(运行队列)并调度它)。

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