64 位 .net 上 Int32/Int64 操作的线程安全

gri*_*zly 3 .net multithreading

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

真的吗?

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

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

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

谢谢

Mar*_*ell 5

重新增加一个值:

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

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

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

相反,请使用Interlocked.IncrementInterlocked.Add等。