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

时间:2018-12-27 21:03:24

标签: c++ multithreading mutex sleep

std::mutex::lock()或条件变量阻塞的线程是否以释放内核以供其他进程使用的方式睡眠,还是我需要手动将这些线程置于睡眠状态?如果为真,std::mutex::try_lock()是否允许一种无需休眠即可旋转线程的方法?

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

如果可以帮助的话,我想避免手动调用睡眠,因此很难调整睡眠时间。那么我可以安全地将其留给互斥锁吗?

2 个答案:

答案 0 :(得分:11)

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

实际上,互斥锁可以结合使用自旋锁定和完整睡眠。睡眠和唤醒相对昂贵,并且编译器可能会在线程进入睡眠状态之前编写锁定以旋转数毫秒。

但是,在主要电话,PC或大型烙铁上没有C ++实现会无限期地自旋锁定。我可以想象有一些嵌入式系统正在这样做,但是我个人还没有遇到过。

答案 1 :(得分:4)

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