【发布时间】:2014-01-13 17:55:37
【问题描述】:
为了执行联锁读取,我使用了InterlockedCompareExchange 函数
value = InterlockedCompareExchange(ptr, 0, 0);
现在我偶然发现了不寻常的情况。
我想在只读(写保护)内存页上使用这个互锁的“读取”。结果是“访问冲突写入位置x”...
所以我猜这是设计使然?我了解InterlockedCompareExchange 通常用作“写入”指令。但是为什么在这种特殊情况下会包含访问冲突触发器呢?
为了执行互锁读取,InterlockedCompareExchange 的替代方案是什么?
更新:我尝试使用
value = InterlockedCompareExchange(ptr, 0, -1);
当我知道 ptr 处的值永远不会为负时,但这也会触发访问冲突,即使在这种情况下肯定没有任何写入发生。所以我想这是本指令的设计...
但是为什么以及如何解决这个问题?
更新 2: 详细了解我开始使用互锁读取的原因。
我故意把我的问题含糊其辞。我通常对这个主题感兴趣,即跳过缓存和原子读取,包括原子 64 位读取。
我开始疑惑的原因是 .NET 在 System.Threading.Interlocked.Read(ref Int64 location)
方法中使用CompareExchange 进行联锁读取。
MSDN 声明此 .NET Interlocked.Read 方法:“Read 方法在 64 位系统上是不必要的,因为 64 位读取操作已经是原子操作。在 32 位系统上,64 位读取除非使用 Read 执行,否则操作不是原子的。”
此外,MSDN 声明(C 语言)InterlockedCompareExchange64 函数在任何情况下都不允许未对齐的操作:“此函数的变量必须在 64 位边界上对齐;否则,此函数将在多处理器 x86 系统和任何非 x86 系统上运行不可预测”。
因此,根据该文本,.NET 也不应该有未对齐的 Int64 变量。但是为什么要联锁阅读呢?
【问题讨论】:
标签: readonly access-violation interlocked