众所周知,如果存在竞争条件,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
如果交换成功(即
al
由1
设置),则使用sete al
将寄存器ZF
设置为cmpxchg
。否则,将其设置为零(即ZF
已由cmpxchg
清除)。