c++ - C++ std::scoped_lock:如果锁阻塞会发生什么?
问题描述
我有兴趣了解更多关于如何std::scoped_lock
运作的信息。
我正在通过在关键部分周围添加互斥锁来对一些线程不安全的代码进行一些修改。
我正在使用 astd::scoped_lock
来执行此操作。
到达代码行时,可能会发生两种情况std::scoped_lock lock(mutex)
:
互斥锁已成功锁定。这里没什么好担心的。
互斥锁由另一个线程 (A) 持有。互斥锁无法锁定,可能是当前线程(B)阻塞。
关于第2点,当能够锁定互斥锁的线程再次解锁它时会发生什么?即:当线程 A 解锁互斥锁(scoped_lock
超出范围)时,线程 B 会做什么?它会自动唤醒并再次尝试锁定互斥锁吗?(当线程 B 无法锁定互斥锁时,它会休眠吗?大概它不会while(1)
像占用 CPU 一样处于无限循环中。)
如您所见,我对 a 的scoped_lock
工作原理没有完全了解。有人能启发我吗?
解决方案
您的基本假设非常正确 - 阻塞,不要过多占用 CPU(有点可以),并让实现处理线程唤醒。
应该提到一种特殊情况:当互斥锁不仅用于保护共享资源,而且专门用于在线程 A&B 之间进行协调时,astd::condition_variable
可以帮助线程同步。这不会替换互斥锁;实际上,您需要锁定互斥锁才能等待条件变量。许多操作系统可以通过更快地唤醒正确的线程来从条件变量中受益。
推荐阅读
- laravel - Livewire - 缺少路由所需的参数
- reactjs - 如何解决错误:找不到模块'./img1.jpg'
- java - 如何在 Java 泛型方法中进行数学运算?
- python - 不同来源的时间序列预测
- javascript - 如何从嵌套在nodejs中的多个表数据的json构建一个sql连接查询?
- javascript - 使用公共键将数据集 (CSV) 与 javascript 组合,其中一个数据集具有多个具有该键的条目
- c++ - 密码 While 循环
- flutter - 如何在颤动中制作圆形图片?
- python - 从所有轮廓中删除选定的轮廓?
- flutter - 'bool?' 类型的值 不能分配给“bool”类型的变量。小部件返回值