gpt4 book ai didi

c# - 是否可以将不相关的锁定语句之后的读取指令移动到锁定之前?

转载 作者:太空狗 更新时间:2023-10-29 21:38:05 25 4
gpt4 key购买 nike

此问题是对 this 中评论的跟进线程。

假设我们有以下代码:

// (1)
lock (padlock)
{
// (2)
}
var value = nonVolatileField; // (3)

此外,我们假设 (2) 中的指令对 nonVolatileField 没有任何影响,反之亦然。

读取指令 (3) 是否可以重新排序,使其在锁定语句 (1) 之前或在 (2) 内部结束?

据我所知,C# 规范 (§3.10) 和 CLI 规范 (§I.12.6.5) 中没有任何内容禁止此类重新排序。

请注意,这与 this 不是同一个问题一。在这里我特别询问阅读说明,因为据我了解,它们不被视为副作用并且保证较弱。

最佳答案

相信 CLI 规范部分保证了这一点,尽管它并不像它可能的那样清楚。来自 I.12.6.5:

Acquiring a lock (System.Threading.Monitor.Enter or entering a synchronized method) shall implicitly perform a volatile read operation, and releasing a lock (System.Threading.Monitor.Exit or leaving a synchronized method) shall implicitly perform a volatile write operation. See §I.12.6.7.

然后从 I.12.6.7 开始:

A volatile read has “acquire semantics” meaning that the read is guaranteed to occur prior to any references to memory that occur after the read instruction in the CIL instruction sequence. A volatile write has “release semantics” meaning that the write is guaranteed to happen after any memory references prior to the write instruction in the CIL instruction sequence.

所以进入锁应该可以防止 (3) 移动到 (1)。我相信,从 nonVolatileField 中读取仍然算作“对内存的引用”。但是,当锁退出时,读取仍然可以在 volatile 写入之前执行,因此它仍然可以移动到(2)。

C#/CLI 内存模型目前还有很多不足之处。我希望整个事情能够得到显着澄清(并可能收紧,使一些“理论上有效但实际上很糟糕”的优化无效)。

关于c# - 是否可以将不相关的锁定语句之后的读取指令移动到锁定之前?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40991335/

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