我想我读到 Int32 和 Int64 上的操作在 .Net 中的 64 位系统上是真正的原子操作(即程序集/应用程序编译为 64 位)。
真的吗?
我找不到 MSDN 引用,所以我想我会在这里问你们。
我想知道是否使用 Interlocked 类来检查和减少来自多个线程的 Int32 的值,我将它编译为 64 位应用程序。
MSDN 上这些方法的文档有一些帮助,但我不确定我是否理解正确。
谢谢
我想我读到 Int32 和 Int64 上的操作在 .Net 中的 64 位系统上是真正的原子操作(即程序集/应用程序编译为 64 位)。
真的吗?
我找不到 MSDN 引用,所以我想我会在这里问你们。
我想知道是否使用 Interlocked 类来检查和减少来自多个线程的 Int32 的值,我将它编译为 64 位应用程序。
MSDN 上这些方法的文档有一些帮助,但我不确定我是否理解正确。
谢谢
重新增加一个值:
手动增量 永远不能保证是原子的——不是在 x86 上,也不是在 x64 上;它是四个操作:加载、加载、添加、存储。JIT 可能会发现一个 load-constant-1 ( ldc_i4_1
/ ldc_i8
) 并使其更简单一些,但从根本上说:这不是一个单一的原子操作。如果不使用某种锁定结构或使用Interlocked
.
重新分配原子性(又名撕裂值):
int
语言规范保证对 (etc) 的操作是原子的;不保证对long
(etc)的操作是. 是的,它们很可能在 x64 上是原子的,但问题是:当担心原子性时,您必须处理线程。在处理线程时,您不会查看实现,即发生了什么 - 因为这不能保证,并且您可能关心此代码是否符合其预期。因此,IMO 你必须只关心什么是有保证的,这意味着:你不能依赖(等)是原子的。long
相反,使用Interlocked.Increment
,Interlocked.Add
等。