代码之家  ›  专栏  ›  技术社区  ›  Anne Quinn

线程在等待锁定的互斥体时是否休眠?

  •  3
  • Anne Quinn  · 技术社区  · 6 年前

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

    我问的原因是:我想在我的线程池中有三种未使用的线程状态:旋转2毫秒,然后被互斥锁250毫秒(假设这样可以让它们休眠并取消对核心的日志记录),最后被释放。

    如果我能帮忙的话,我想避免手动调用sleep,调整睡眠时间会很困难。所以我可以安全地把它留给互斥体吗?

    2 回复  |  直到 6 年前
        1
  •  11
  •   Baum mit Augen    6 年前

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

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

    没有一个主要的电话、PC或大铁器的C++实现将无限期地旋转锁定。我可以想象一些嵌入式系统会这样做,但我个人并没有遇到。

        2
  •  4
  •   Jesper Juhl    6 年前

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

    推荐文章