c++ - 这是互斥锁的情况吗?

标签 c++ mutex boost-mutex

我有一个从设备捕获数据的线程。我从 gui 启动/停止线程。目前,线程定期检查 appcontext 中的 bool 成员 isCapturingEnabled。我从 gui 切换这个 bool 成员以停止线程。

在这种情况下我应该使用互斥量吗?因为捕获线程和主线程可能会尝试同时写入和读取 bool

最佳答案

你会遇到的问题是,如果没有某种锁定或内存屏障,gui 线程可能(例如)将 bool 设置为 true 但线程实际上不会看到这一点是由于编译器优化或 CPU 级别的优化。

您需要做的是以这样一种方式写入bool,即从内存加载当前状态,并正确写回新状态,以便所有线程都能看到更改。如您所见,一种方法是使用互斥锁。其他方法是使用 memory barriers以确保您正在访问正确的内存 View 。大多数语言或操作系统通常都有某种 API,用于以原子方式操作最大为单词大小的内存。例如,在 Windows 上有 InterlockedCompareExchange功能。

但是,在 95% 的情况下,从性能的角度来看,仅将读/写包装在互斥锁中就足够了,并且在多线程正确性方面很容易推理。

关于c++ - 这是互斥锁的情况吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28966547/

相关文章:

c++ - 为什么不重新锁定互斥锁的 condition_variable 没有等待函数

c++ - 线程池卡在等待状态

c - 多个线程如何更改互斥锁锁定的静态变量

c++ - boost 共享互斥锁检查是否锁定在同一个线程中

c++ - 在 const 函数中使用 boost::mutex::scoped_lock

c++ - 为什么我不能将这个转换后的 directory_iterator 插入到一个 vector 中?

c++ - 在 gdb 中打印 C++ std::set 字符串的第一个元素?

c++ - 在 QStatusBar 调整大小时防止窗口调整大小

c++ - 在 C++ 中引用而不通过引用传递

c++ - 如何正确使用 boost::timed_mutex 和 scoped_lock