在MSVC for x64(19.10.25019)上,
InterlockedOr(&g, 1)
Run Code Online (Sandbox Code Playgroud)
生成此代码序列:
prefetchw BYTE PTR ?g@@3JC
mov eax, DWORD PTR ?g@@3JC ; g
npad 3
$LL3@f:
mov ecx, eax
or ecx, 1
lock cmpxchg DWORD PTR ?g@@3JC, ecx ; g
jne SHORT $LL3@f
Run Code Online (Sandbox Code Playgroud)
我本来期望更简单(和无环):
mov eax, 1
lock or [?g@@3JC], eax
Run Code Online (Sandbox Code Playgroud)
InterlockedAnd生成类似的代码InterlockedOr.
必须为此指令设置循环似乎非常低效.为什么会生成此代码?
(作为旁注:我使用的全部原因是InterlockedOr对变量进行原子加载 - 我已经知道这InterlockedCompareExchange是做到这一点的方法.我很奇怪没有InterlockedLoad(&x),但我离题了... )