gpt4 book ai didi

c# - 在 64 位英特尔处理器上,对 double 类型变量的读写保证是原子的吗?

转载 作者:行者123 更新时间:2023-11-30 20:48:36 26 4
gpt4 key购买 nike

我有一台运行 64 位处理器的 64 位机器,但我的应用程序是 32 位的。读取或写入 double 保证是原子的吗?我说的是作业和阅读。 32 位进程如何影响此进程?当其他线程在给定规范中写入时,读者能否从 double 中读取部分值?

最佳答案

没有。 double 可以轻松跨越 L1 缓存线边界,需要多个总线周期才能将两个部分粘合在一起。 C# 中一个非常现实的问题,32 位 CLR 仅提供 4 的对齐保证。

这些未对齐的访问不仅不是原子的,而且由于处理器需要进行洗牌,它们的开销也很大。使用 double 的代码可以有 3 个不同的时序,如果 double 恰好意外对齐到 8 则速度快,当它未对齐到 4 但仍在 L1 缓存行内时慢两倍,当它跨过一个未对齐时慢三倍以上缓存行。当垃圾收集器压缩堆并移动 double 时,这样的程序可能会随机进入其中一种模式。对此要非常警惕,综合测试程序很容易错过这种故障模式。

perf 问题是 double[] 在大对象堆中更快正常分配的核心原因。 LOH 提供对齐到 8 的保证。正常规则是对象 >= 85,000 字节,对于 double[] 在 32 位模式下它是 8,000 字节(数组中的 1000 个元素)。

如果您需要原子性保证,您必须使用 Interlocked.Exchange()。而且我应该发布免责声明,即原子性是一种非常弱的保证,并且在需要时不能替代适当的锁定。

关于c# - 在 64 位英特尔处理器上,对 double 类型变量的读写保证是原子的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24448677/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com