1
12
你可以试试看 CHESS 看看它是否能强制一个中断测试的交错。 如果您查看x86分解程序集(在调试器中可见),还可能会看到jitter是否正在生成保留原子性的指令。
在这两种情况下,它都使用一个fstp qword ptr来执行写操作。我的猜测是,英特尔CPU保证了这个操作的原子性,尽管我还没有找到任何文档来支持这一点。有谁能证实这一点?
如果使用Int64,则会像预期的那样失败,Int64使用x86 CPU上的32位寄存器,而不是特殊的FPU寄存器。您可以在下面看到:
更新: 我很好奇,如果我强制内存中双字段的非8字节对齐,这是否会失败,所以我整理了以下代码:
它不会失败,生成的x86指令与以前基本相同:
|
2
4
编译器被允许优化掉文件的重复读取
要防止这种情况,您需要同步访问
|
3
2
这样两个线程就可以同时读/写同一个变量。
http://msdn.microsoft.com/en-us/library/system.double.aspx 但是,如果两个线程都在读/写同一个变量实例,则: http://msdn.microsoft.com/en-us/library/system.double.aspx
因此,如果两个线程都在读/写同一个变量实例,则需要一个锁来保护它(或者联锁读/增量/交换(不确定这是否适用于双打) 编辑
|
4
0
我认为正确答案是5。 double是8字节长。
还有CPU缓存。在我的机器上,缓存线是64字节,在所有CPU上是8的倍数。 如上所述,即使CPU在32位模式下运行,也只需一条指令就可以加载和存储双变量。
|
Rasim Avcı · 如何履行承诺。解析需要原子化的代码 6 年前 |
Lingxi · 真正测试std::atomic是否无锁 6 年前 |
Rajeev Mehta · 修改和读取原子变量 6 年前 |
Chris Jefferson · 在Rust中获得“无序”语义 6 年前 |
Jérôme B · redis自动切换值 7 年前 |
krimog · 更新where select,保证原子性 7 年前 |