c# - Interlocked.CompareExchange 的参数是原子操作的一部分吗?

标签 c# atomic

以下语句(寻址与第一个和第三个参数相同的变量)是否总是导致变量 b 在完成时获取变量 c 的值,或者另一个线程是否有可能在获取参数时更改一个或多个参数导致第一个和第三个参数在比较操作期间包含不同的值?

a = Interlocked.CompareExchange(ref b, c, b)

最佳答案

这是一个有趣的问题;我怀疑答案是“不能保证”,因为字段的值可以在 ldfld (最终参数)之后但在通过地址评估之前(之前通过ldflda),但这在很大程度上是学术性的,就像这样的线程代码一样,重要的是做一些明显正确的事情。

显然“不能保证”不允许我们确定太多,因此毫无用处。如果我们想要“这是有保证的”答案,那么这个问题就变得毫无意义,因为简单地使用Interlocked.Exchange可能会更容易、更明显。

关于c# - Interlocked.CompareExchange 的参数是原子操作的一部分吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17118144/

相关文章:

c# - 遍历 SQLite 表

c# - 如何使用 DotNetBrowser 将父 iframe 作为 IElement?

c# - 在 web.config 中增加 MaxFieldLength 和 MaxRequestBytes

c# - 目标程序集不包含任何服务类型。您可能需要调整此程序集的代码访问安全策略

c# - 抽象类中返回 IEnumerable<DerivedType> 的静态方法

java - Vavr Set 字段应该是 volatile 的、原子性的还是以其他方式声明的?

c++ - 为了在 C++ 中线程安全,我应该使用互斥锁保护原始类型上的操作吗?

C原子读修改写

git - 使用 Git 进行原子网站更新

java - 原子性真的是不可中断的还是几乎不可中断的?