正如我最近发布的这个答案所示,我似乎对volatile多线程编程环境中的实用程序(或缺乏实用程序)感到困惑.
我的理解是这样的:每当一个变量可以在访问它的一段代码的控制流之外被改变时,该变量应该被声明为volatile.信号处理程序,I/O寄存器和由另一个线程修改的变量都构成这种情况.
所以,如果你有一个全局int foo,并且foo由一个线程读取并由另一个线程原子设置(可能使用适当的机器指令),则读取线程看到这种情况的方式与它看到由信号处理程序调整的变量或由外部硬件条件修改,因此foo应该声明volatile(或者,对于多线程情况,使用内存隔离负载访问,这可能是一个更好的解决方案).
我怎么错,哪里错了?
asm volatile("": : :"memory")通常用作内存屏障(例如,在Linux内核barrier宏中看到).
这听起来与GCC内置的相似__sync_synchronize.
这两个相似吗?
如果没有,有什么区别,何时使用另一个?
C#规范说,对于32位类型和更小的(以及参考),读取和写入是原子的.因此,如果我的类中有一个Int32字段,我知道多个线程可以读取和写入它,并且它们将在运行中处于原子状态,因此值始终是一致的(尽管缓存问题是一个潜在的问题,但这不是重点这个问题).
在64位系统上也是如此吗?如果我为64位编译我的应用程序是否意味着Int64仍然被认为不是原子的?或者我现在可以认为Int64在读/写中是原子的,因为它是在64位系统上编译并运行的吗?