1

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

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

4

1 回答 1

3

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

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

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

于 2015-03-10T14:49:27.590 回答