首页 > 解决方案 > C++ std::scoped_lock:如果锁阻塞会发生什么?

问题描述

我有兴趣了解更多关于如何std::scoped_lock运作的信息。

我正在通过在关键部分周围添加互斥锁来对一些线程不安全的代码进行一些修改。

我正在使用 astd::scoped_lock来执行此操作。

到达代码行时,可能会发生两种情况std::scoped_lock lock(mutex)

  1. 互斥锁已成功锁定。这里没什么好担心的。

  2. 互斥锁由另一个线程 (A) 持有。互斥锁无法锁定,可能是当前线程(B)阻塞。

关于第2点,当能够锁定互斥锁的线程再次解锁它时会发生什么?即:当线程 A 解锁互斥锁(scoped_lock超出范围)时,线程 B 会做什么?它会自动唤醒并再次尝试锁定互斥锁吗?(当线程 B 无法锁定互斥锁时,它会休眠吗?大概它不会while(1)像占用 CPU 一样处于无限循环中。)

如您所见,我对 a 的scoped_lock工作原理没有完全了解。有人能启发我吗?

标签: c++multithreadingmutual-exclusionscoped-lock

解决方案


您的基本假设非常正确 - 阻塞,不要过多占用 CPU(有点可以),并让实现处理线程唤醒。

应该提到一种特殊情况:当互斥锁不仅用于保护共享资源,而且专门用于在线程 A&B 之间进行协调时,astd::condition_variable可以帮助线程同步。这不会替换互斥锁;实际上,您需要锁定互斥锁才能等待条件变量。许多操作系统可以通过更快地唤醒正确的线程来从条件变量中受益。


推荐阅读