在Java中,更新double和long变量可能不是原子变量,因为double/long被视为两个独立的32位变量.
http://java.sun.com/docs/books/jls/second_edition/html/memory.doc.html#28733
在C++中,如果我使用的是32位Intel Processor + Microsoft Visual C++编译器,那么更新双(8字节)操作原子?
我找不到关于这种行为的规范.
当我说"原子变量"时,这就是我的意思:
线程A试图将1写入变量x.线程B试图将2写入变量x.
我们将从变量x得到值1或2,但不是未定义的值.
Gun*_*iez 11
这是特定于硬件的,取决于架构.对于x86和x86_64,如果对齐,则保证8字节写入或读取是原子的.引自英特尔架构内存订购白皮书:
Intel 64内存排序保证,对于以下每个内存访问指令,组态内存操作似乎作为单个内存访问执行,而不管内存类型如何:
读取或写入单个字节的指令.
读取或写入地址在2字节边界上对齐的字(2个字节)的指令.
读取或写入双字(4字节)的指令,其地址在4字节边界上对齐.
- 读取或写入四字(8字节)的指令,其地址在8字节边界上对齐.
所有锁定的指令(隐式锁定的xchg指令和带锁定前缀的其他读取 - 修改 - 写入指令)是一个不可分割且不间断的负载序列,后跟存储器,而不管存储器类型和对齐情况如何.