如果一个全局变量在两个不同核心上的2个并发运行的线程之间共享,即使对共享变量的访问受到临界区的控制,仍有数据竞争或意外值的可能吗?我需要声明变量为原子(volatile)吗?每个核心可能在其缓存中具有共享变量的值,当一个线程在其缓存中写入其副本时,另一个不同核心上的线程在1号线程释放锁后可能从其缓存中读取旧值。编译器是否默认为由临界区或互斥锁控制的变量生成volatile读/写的代码?
如果所有对共享变量的访问都由相同的互斥锁或关键部分保护,则即使线程在不同的核心上,也将避免数据竞争和该变量上出现意外值。互斥锁的锁定和解锁函数将包括必要的同步指令,以确保缓存在处理器核心之间正确同步。在锁定区域内,可以使用普通指令来访问共享变量。除非您打算在没有互斥锁保护的情况下访问它们,否则无需将共享变量声明为原子变量。