众所周知,如果存在竞争条件,compare_exchange_weak()将返回错误(假值),因此无法完全完成该操作。但是如何由compare_exchange_weak()确定种族条件呢?

如果一个以上的线程试图读取/写入值,即获取锁,并且lock cmpxchg正是以此方式确定竞争条件,那么compare_exchange_weak指令是否会返回错误?

最佳答案

cmpxchg指令会影响ZF标志:如果交换成功,则将其置位,否则将其清除。

让我们来看一个例子:

std::atomic<int> a;

bool my_compare_exchange(int expected, int desired) {
   bool succeeded = a.compare_exchange_weak(expected, desired);
   return succeeded;
}

函数my_compare_exchange()转换为以下汇编代码:
my_compare_exchange:
        mov     eax, edi
        lock cmpxchg    DWORD PTR a[rip], esi
        sete    al // <-- conditional instruction
        ret

如果交换成功(即al1设置),则使用sete al将寄存器ZF设置为cmpxchg。否则,将其设置为零(即ZF已由cmpxchg清除)。

10-08 00:43