正在更新双重操作原子

Che*_*eng 10 c++ visual-c++

在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内存排序保证,对于以下每个内存访问指令,组态内存操作似乎作为单个内存访问执行,而不管内存类型如何:

  1. 读取或写入单个字节的指令.

  2. 读取或写入地址在2字节边界上对齐的字(2个字节)的指令.

  3. 读取或写入双字(4字节)的指令,其地址在4字节边界上对齐.

  4. 读取或写入四字(8字节)的指令,其地址在8字节边界上对齐.

所有锁定的指令(隐式锁定的xchg指令和带锁定前缀的其他读取 - 修改 - 写入指令)是一个不可分割且不间断的负载序列,后跟存储器,而不管存储器类型和对齐情况如何.

  • 它还取决于编译器,它不需要确保双头首先是8对齐,或者使用单个四字运算来读取或写入它们.虽然你认为它可能会,但我也期望visual c ++文件是否成功. (3认同)