我有一个从设备捕获数据的线程。我从gui开始/停止线程。目前,该线程会定期检查appcontext中的bool
成员isCapturingEnabled
。我从gui切换这个bool
成员来阻止线程。
这是我应该使用互斥锁的情况吗?因为捕获线程和主线程可能会尝试同时写入和读取bool
。
答案 0 :(得分:3)
你遇到的问题是,如果没有某种锁定或内存障碍,可能(例如)gui线程可能会将bool
设置为true,但线程实际上不会看到此在CPU级别进行编译器优化或优化。
您需要做的是写入bool
,以便从内存加载当前状态,并正确写回新状态,以便所有线程都能看到更改。一种方法是使用互斥锁,正如您所确定的那样。其他方法是使用memory barriers来确保您正在访问正确的内存视图。大多数语言或操作系统通常都有某种API,用于以原子方式操作内存大小达到单词大小。例如,在Windows上有InterlockedCompareExchange函数。
然而,在95%的情况下,从性能的角度来看,只需将读/写包装在互斥锁中就足够了,并且在多线程正确性方面很容易理解。