小编R. *_*ter的帖子

在MSVC中,为什么InterlockedOr和InterlockedAnd生成循环而不是简单的锁定指令?

在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),但我离题了... )

interlocked lock-free visual-c++ data-synchronization

3
推荐指数
1
解决办法
313
查看次数