【发布时间】:2012-02-08 11:31:09
【问题描述】:
在阅读了关于如何不应该使用 volatile 来标记正在运行的线程退出的各种答案(以及使用 boost:atomic<> 的建议)之后,我仍然找不到关于如何在没有 C++ 的情况下使用 boost 正确执行此操作的答案11.
- 我应该使用
boost::mutex吗? - 如果是这样,我是否需要锁定我的
m_stopThread变量并将其更改为 true 并在我的运行循环中进行检查? -
boost::mutex锁定调用是要调用操作系统还是仅使用内存屏障指令等更轻松?
【问题讨论】:
-
interrupt有什么问题? -
互斥锁实现有所不同,但例如Linux 有
futex("Fast Userspace muTEX"),它旨在避免系统调用,除非锁被实际争用。 AFAIK 所有 Linux 同步原语都尽可能使用它,因此 Linux 上的boost::mutex应该具有相同的属性。出于同样的原因,Windows 上的boost::mutex可能会尽可能使用CriticalSection,但您必须检查一下。 -
哦,当锁被争用时系统调用“无关紧要”,因为在获取锁时,您将进入睡眠状态或以其他方式闲置,因此您“负担得起”它们。释放锁时,好的,当您必须进行系统调用以唤醒其他人时,确实会花费一些时间。但在实践中,大多数锁不会经历很多争用,因此除非在激进的实时环境中,否则偶尔的性能损失并不重要。
-
从实用的角度来看,简单的 volatile 标志可以正常工作。从理论上看为什么不使用c++11?
-
@user396672:问题(可能取决于您的实际代码)是编译器可以重新排序对非易失性变量的访问。如果两个线程之间的唯一交互是布尔标志,那么缺乏更严格的保证可能无关紧要,但如果有任何其他数据交换(考虑更新发布者中的值并通过 volatile 标志通知消费者) 未指定关于通知的发布顺序。
标签: c++ multithreading boost mutex