【发布时间】:2016-02-22 16:29:48
【问题描述】:
Interlocked.Increment 的 MSDN 文档指出:
此方法通过包装处理溢出条件:if location = Int32.MaxValue, location + 1 = Int32.MinValue。不抛出异常。
“位置 + 1”在这种情况下是什么意思?如果Increment 更改了 location 字段旁边的内存位置,这不会导致 .NET 运行时损坏,因为这个相邻位置可以是任何东西(对象引用、类元数据等)?
【问题讨论】:
-
在这种情况下,
location只是一个 int 变量的名称。所以说location + 1只是一个普通的数学陈述。 -
location + 1 只是一个数学语句。
location = Int32.MaxValue所以 location + 1 会溢出到Int32.MinValue -
是的,这更有意义。 (我一直在阅读太多指针算术。)感谢大家的澄清!
-
这是一个非常平庸的名字,参数实际上是一个指针。因此“位置”。 C# 中的 ref 关键字确保在运行时生成指针。抖动直接将该方法转换为单个 CPU 指令,LOCK XADD 用于 x86 和 x64,不会发生运行时损坏。
-
我猜这个名字让我很反感,同时使用
=来表示相等而不是赋值。我想我可能遗漏了一些明显的东西。
标签: c# .net overflow interlocked