2012-08-28 39 views
2

我想我读了Int32和Int64上的操作在64位系统上(即,程序集/应用程序编译为64位)是真正原子的。净。64位.net上的Int32/Int64操作的线程安全性

这是真的吗?

我无法找到MSDN引用,所以我想我会问你们这里。

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

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

由于

+0

你所说的 “使用互锁类” 是什么意思? –

+0

它意味着使用System.Threading.Interlocked类来递减Int32的值。 – grizzly

回答

4

再递增值:

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

重新分配原子(又名撕裂值):上int(等)

操作保证是由语言规范原子; long(etc)的操作不能保证为。是的,它很可能是在x64上是原子,但是这里是一个问题:当担心原子性时,你必须处理线程。当线程处理,您不看的实施,即什么发生是 - 因为这是不能保证,你可能关心这个代码做什么打算。作为这样的国际海事组织,你必须只关心什么保证,这意味着:你不能依靠long(等)是原子。

相反,使用Interlocked.IncrementInterlocked.Add

+0

哇,谢谢你的回答。我在MSIL代码中检查过,你是对的:(int)i ++使用了四个步骤:ldloc.0,ldc.i4.1,add,stloc.0。这些答案就是让你明白你在做什么。 – grizzly

+1

@在某些方面,你可能认为自己可能是一个“通过这个i4/i8引用逐步增加”的理由,并不合理......这可能是JIT在幕后做到的。 –

相关问题