2

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

真的吗?

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

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

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

谢谢

4

1 回答 1

4

重新增加一个值:

手动增量 永远不能保证是原子的——不是在 x86 上,也不是在 x64 上;它是四个操作:加载、加载、添加、存储。JIT 可能会发现一个 load-constant-1 ( ldc_i4_1/ ldc_i8) 并使其更简单一些,但从根本上说:这不是一个单一的原子操作。如果使用某种锁定结构或使用Interlocked.

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

int语言规范保证对 (etc) 的操作是原子的;不保证long(etc)的操作是. 是的,它们很可能在 x64 上原子的,但问题是:当担心原子性时,您必须处理线程。在处理线程时,您不会查看实现,即发生了什么 - 因为这不能保证,并且您可能关心此代码是否符合其预期。因此,IMO 你必须只关心什么是有保证的,这意味着:你不能依赖(等)是原子的。long

相反,使用Interlocked.Increment,Interlocked.Add等。

于 2012-08-28T11:46:56.180 回答