我想我读过Int32和Int64上的操作在64位系统上是真正的原子(即。汇编/应用程序被编译为64位).Net中。
这是真的吗?
我找不到MSDN的引文,所以我想我会问你们这里的人。
我想知道是否使用Interlocked类来检查和减少来自多个线程的Int32的值,并且我将其编译为64位应用程序。
在MSDN上对这些方法的文档有一些帮助,但我不确定我是否正确理解它。
由于
答案 0 :(得分:4)
重新递增值:
手动增量 绝不是 保证是原子的 - 不是在x86上,而是在x64上;这是四个操作:加载,加载,添加,存储。 JIT可能会发现一个load-constant-1(ldc_i4_1
/ ldc_i8
)并使其更简单,但从根本上说:这不是一个单一的原子操作。您不能在多线程代码中执行线程安全增量(不会有丢失更新的风险)而不使用某种锁定构造或使用Interlocked
。
重新分配原子性(又名撕裂的值):
语言规范保证int
(等)上的操作是原子的; long
(等) 上的操作不能保证 。是的,很可能他们在x64上是原子,但这就是问题:当担心原子性时,你必须处理线程。在处理线程时,你看起来不,即发生 - 因为 无法保证 < / strong>,你可能会担心这段代码符合它的意图。作为这样的IMO,您只能关注 保证,这意味着:您不能依赖long
(等)是原子的。
相反,请使用Interlocked.Increment
,Interlocked.Add
等