等待条件变量是否会加载 CPU 内核
Does waiting on a condition variable load the CPU core?
等待条件变量是否会导致循环通过指令将 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上。
- std::原子加载和存储都需要吗
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 为什么加载SDF会导致Mobilizer创建闭环错误
- C++atioglxx.pdb未加载错误glBufferData OpenGL
- 如何使用tinyxml2从XML加载父实体和子实体
- 如何在C++中使用pybind11加载一个pickle python列表
- 系统.将数组移交给c#中动态加载的c++DLL时发生AccessViolationException
- 当我尝试加载内核模块时,如何修复C++中的这个 malloc() 错误?
- 树莓上的 Libtorch 无法加载 pt 文件,但在 ubuntu 上工作
- Python ctypes:不会按预期加载 dll
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 我的程序有一个保存配置文件的GUI,如何双击此配置文件以直接加载带有配置数据的GUI?
- 保存/加载大量短数组到二进制文件
- 使用 SDL2 和SDL_image C++加载图像
- 等待条件变量是否会加载 CPU 内核
- CPU 缓存是否也从以前的内存位置加载信息
- 阻止或阻塞cpu数据缓存加载
- 无锁队列,加载与卸载CPU
- 如何加载(mov)类变量到CPU寄存器