在64位.net上对Int32 / Int64操作进行线程安全

时间:2012-08-28 11:38:25

标签: .net multithreading

我想我读过Int32和Int64上的操作在64位系统上是真正的原子(即。汇编/应用程序被编译为64位).Net中。

这是真的吗?

我找不到MSDN的引文,所以我想我会问你们这里的人。

我想知道是否使用Interlocked类来检查和减少来自多个线程的Int32的值,并且我将其编译为64位应用程序。

在MSDN上对这些方法的文档有一些帮助,但我不确定我是否正确理解它。

由于

1 个答案:

答案 0 :(得分:4)

重新递增值:

手动增量 绝不是 保证是原子的 - 不是在x86上,而是在x64上;这是四个操作:加载,加载,添加,存储。 JIT可能会发现一个load-constant-1(ldc_i4_1 / ldc_i8)并使其更简单,但从根本上说:这不是一个单一的原子操作。您不能在多线程代码中执行线程安全增量(不会有丢失更新的风险)而不使用某种锁定构造或使用Interlocked

重新分配原子性(又名撕裂的值):

语言规范保证int(等)上的操作是原子的; long(等) 上的操作不能保证 。是的,很可能他们在x64上是原子,但这就是问题:当担心原子性时,你必须处理线程。在处理线程时,你看起来不,即发生 - 因为 无法保证 < / strong>,你可能会担心这段代码符合它的意图。作为这样的IMO,您只能关注 保证,这意味着:您不能依赖long(等)是原子的。

相反,请使用Interlocked.IncrementInterlocked.Add