首页 > 解决方案 > compare_exchange C++ 函数如何确定竞争条件?

问题描述

众所周知,compare_exchange_weak()如果存在竞争条件,则返回错误(假值),因此无法完全完成操作。但是比赛条件究竟是如何决定的compare_exchange_weak()呢?

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

标签: c++multithreadingx86-64atomiccompare-and-swap

解决方案


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

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


推荐阅读