作者:发出耀眼气息 | 来源:互联网 | 2022-12-01 18:46
如我们所知,compare_exchange_weak()
如果存在竞争条件,则返回错误(错误值),因此无法完全执行操作.但是竞争条件究竟是如何确定的compare_exchange_weak()
?
lock cmpxchg
如果多一个线程尝试读/写值,即获取锁,并且确切地说这种方式compare_exchange_weak
决定竞争条件,指令是否会返回错误?
1> 眠りネロク..:
该cmpxchg
指令影响该ZF
标志:如果交换成功则设置,否则清除.
让我们看一个例子:
std::atomic 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