在等待锁定的互斥锁时线程是否会睡眠?

Ann*_*inn 4 c++ multithreading mutex sleep

被一个std::mutex::lock()或一个条件变量阻塞的线程是否会以释放其他进程的核心的方式休眠,或者我是否需要手动将这些线程置于休眠状态?如果是真的,会std::mutex::try_lock()允许一种方法来旋转线程而不睡觉吗?

我问的原因是:我希望线程池中的线程有三种状态未使用:旋转2毫秒,然后由互斥锁定250毫秒(假设这让他们睡觉并解除核心),最后被解除分配.

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

Yak*_*ont 13

这是具体的实施; C++标准没有直接对它说话.

在实践中,互斥锁可以使用自旋锁和完全睡眠的组合.睡眠和唤醒是相对昂贵的,并且编译器可以在将线程置于睡眠状态之前将锁写入旋转几毫秒.

然而,在主要手机,PC或大型主机上没有C++实现无限期地旋转锁定.我可以想象一些嵌入式系统这样做,但没有亲自遇到过.


Jes*_*uhl 5

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