以下语句(寻址与第一个和第三个参数相同的变量)是否总是导致变量 b 在完成时获取变量 c 的值,或者另一个线程是否有可能在获取参数时更改一个或多个参数导致第一个和第三个参数在比较操作期间包含不同的值?
a = Interlocked.CompareExchange(ref b, c, b)
最佳答案
这是一个有趣的问题;我怀疑答案是“不能保证”,因为字段的值可以在 ldfld (最终参数)之后但在通过地址评估之前(之前通过ldflda
),但这在很大程度上是学术性的,就像这样的线程代码一样,重要的是做一些明显正确的事情。
显然“不能保证”不允许我们确定太多,因此毫无用处。如果我们想要“这是有保证的”答案,那么这个问题就变得毫无意义,因为简单地使用Interlocked.Exchange
可能会更容易、更明显。
关于c# - Interlocked.CompareExchange 的参数是原子操作的一部分吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17118144/