并发:用于多线程环境中共享变量的C++11内存模型



如果一个全局变量在两个不同核心上的两个同时运行的线程之间共享,那么即使对共享变量的访问由关键部分控制,是否存在数据竞争或意外值的可能性?我需要声明变量atomic(volatile)吗?每个核心的缓存中可能都有一个共享变量的值,当一个线程在缓存中写入其副本时,不同核心上的另一个线程可能会在线程1释放锁后从其缓存中读取过时的值。编译器是否为由关键部分或默认互斥体控制的变量生成易失性读/写代码?

如果对共享变量的所有访问都受到同一互斥对象或关键部分的保护,那么即使线程位于不同的核心上,也可以避免该变量上的数据争用和意外值。互斥锁的锁定和解锁功能将包括必要的同步指令,以确保缓存在处理器内核之间正确同步。在锁定区域内,可以使用普通指令来访问共享变量。

没有必要将共享变量声明为原子变量,除非您打算在没有互斥锁保护的情况下访问它们。

最新更新