【发布时间】:2012-01-31 19:56:59
【问题描述】:
我正在使用 MSIL 反编译器 - ILDASM 并尝试反编译一个简单的 .NET 方法。
操作码看起来像这样:
.method private hidebysig static int32 Add(int32 a,
int32 b) cil managed
{
// Code size 18 (0x12)
.maxstack 2
.locals init ([0] int32 c,
[1] int32 d,
[2] int32 CS$1$0000)
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldc.i4.5
IL_0003: add
IL_0004: stloc.0
IL_0005: ldarg.1
IL_0006: ldc.i4.s 10
IL_0008: add
IL_0009: stloc.1
IL_000a: ldloc.0
IL_000b: ldloc.1
IL_000c: add
IL_000d: stloc.2
IL_000e: br.s IL_0010
IL_0010: ldloc.2
IL_0011: ret
}
我想知道的是 - 这些操作码是原子的吗?即在抢占式调度内核中,单个操作码是否可以在完成执行之前被抢占?这里的操作码可以很容易地以几乎 1:1 的比例映射到 asm 指令,因为它们具有用于加载、存储、添加等单独的操作码。
但是如果操作码更复杂怎么办?像“调用”一样,当操作数是一个方法引用标记时,应该首先遵循它来解析方法然后调用?那也是原子的吗?
【问题讨论】:
-
取决于处理器...
标签: .net multithreading atomic cil