compare_exchange C++函数如何确定竞争条件?

TwI*_*ITe 3 c++ multithreading x86-64 atomic compare-and-swap

如我们所知,compare_exchange_weak()如果存在竞争条件,则返回错误(错误值),因此无法完全执行操作.但是竞争条件究竟是如何确定的compare_exchange_weak()

lock cmpxchg如果多一个线程尝试读/写值,即获取锁,并且确切地说这种方式compare_exchange_weak决定竞争条件,指令是否会返回错误?

眠りネ*_*ネロク 5

cmpxchg指令影响该ZF标志:如果交换成功则设置,否则清除.

让我们看一个例子:

std::atomic<int> a;

bool my_compare_exchange(int expected, int desired) {
   bool succeeded = a.compare_exchange_weak(expected, desired);
   return succeeded;
}
Run Code Online (Sandbox Code Playgroud)

该函数my_compare_exchange()被转换为以下汇编代码:

my_compare_exchange:
        mov     eax, edi
        lock cmpxchg    DWORD PTR a[rip], esi
        sete    al // <-- conditional instruction
        ret
Run Code Online (Sandbox Code Playgroud)

如果交换成功(即设置为),则将寄存器al设置为1使用.否则,它被设置为零(即被清除).sete alZFcmpxchgZFcmpxchg