如果在2个不同内核上的2个并发运行线程之间共享全局变量,即使对共享变量的访问受临界区控制,是否有可能出现数据争用或意外值?我需要声明变量atomic(volatile)吗?每个核心可能在其缓存中具有共享变量的值,并且当一个线程在缓存中写入其副本时,另一个核心上的另一个线程可能在线程1释放锁定后从其缓存中读取过时值。编译器是否为默认情况下由关键部分或互斥锁管理的变量生成易失性读/写的代码?
答案 0 :(得分:9)
如果对共享变量的所有访问都受同一个互斥锁或关键部分的保护,那么这将避免该变量上的数据争用和意外值,即使这些线程位于不同的核心上也是如此。互斥锁的锁定和解锁功能将包括必要的同步指令,以确保高速缓存在处理器内核之间正确同步。在锁定区域内,可以使用正常指令来访问共享变量。
除非您打算访问而不保护互斥锁,否则无需将共享变量声明为原子。