线程在等待锁定的互斥体时会休眠吗?

Do threads sleep when waiting on a locked mutex?

std::mutex::lock() 或条件变量阻塞的线程是否以释放内核供其他进程使用的方式休眠,或者我是否需要手动让这些线程休眠?如果为真,std::mutex::try_lock() 是否允许在不休眠的情况下旋转线程?

我问的原因:我希望线程池中未使用的线程具有三种状态:自旋 2 毫秒,然后被互斥锁锁定 250 多毫秒(假设这让它们休眠并取消占用核心),然后最终被释放。

如果可以的话,我想避免手动调用睡眠,调整睡眠持续时间会很困难。那么我可以安全地将它留给互斥体吗?

是的。此类阻塞的线程会休眠,不会占用任何 CPU 个周期。

这是特定于实现的; C++ 标准不直接与它对话。

实际上,互斥锁可能会结合使用自旋锁和完全睡眠。休眠和唤醒相对昂贵,编译器可能会在让线程休眠之前编写锁以自旋几毫秒。

主要 phone 上没有 C++ 实现,但是 PC 或 big iron 将无限期地自旋锁。我可以想象一些嵌入式系统会这样做,但还没有亲身遇到过。