gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:52:41 26 4
gpt4 key购买 nike

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

这是真的吗?

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

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

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

谢谢

最佳答案

重新递增一个值:

手动增量永远不会保证是原子的——在 x86 和 x64 上都不是;它是四个操作:加载、加载、添加、存储。 JIT 可能会发现 load-constant-1 (ldc_i4_1/ldc_i8) 并使其更简单一些,但从根本上讲:这不是单个原子操作。如果不使用某种锁定构造或使用 Interlocked,您不能在多线程代码中执行线程安全增量(不会有丢失更新的风险)。

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

int(等)上的操作由语言规范保证是原子的; long(等)操作不保证。是的,它们很可能在 x64 上 是原子的,但问题是:当担心原子性时,您必须处理线程。在处理线程时,您不看实现,即发生的情况 - 因为不能保证/strong>,并且您可能关心此代码是否按预期执行。作为这样的 IMO,您必须只关心保证的,这意味着:您不能依赖long(等)是原子的.

相反,请使用 Interlocked.IncrementInterlocked.Add

关于.net - 64 位 .net 上 Int32/Int64 操作的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12158475/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com