_InterlockedIncrement内部实现

时间:2012-07-09 08:24:49

标签: visual-studio-2010 assembly x86 intrinsics

使用_InterlockedIncrement时,Visual Studio会生成以下机器代码:

; 40   :        _InterlockedIncrement(&framecounter);

  00078 b8 00 00 00 00   mov     eax, OFFSET ?framecounter@@3JA ; framecounter
  0007d b9 01 00 00 00   mov     ecx, 1
  00082 f0 0f c1 08  lock     xadd   DWORD PTR [eax], ecx

如果我要写这篇文章,我只会使用lock inc DWORD PTR [eax]代替movxadd

Microsoft是否有正当理由选择xadd并使用2条指令代替1?

1 个答案:

答案 0 :(得分:5)

因为_InterlockedIncrement也会返回新值。

您无法使用lock inc DWORD PTR [eax]执行此操作,因为现在找不到旧值和新值。除了在内存中,但如果你进行其他阅读,显然它不会是原子的(增量本身就是,但你可以得到一个与增量时发生的事情无关的值)

返回该值会使_InterlockedIncrement更有用。