这是互斥锁的情况吗?

Is this a case for a mutex?

本文关键字:情况      更新时间:2023-10-16

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

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

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

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

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