c++ - compare_exchange C++ 函数如何确定竞争条件?
问题描述
众所周知,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
推荐阅读
- python - Keras - 将图像从生成器加载到内存中
- intellij-idea - 从无处不在的搜索结果中隐藏运行配置
- typo3 - TYPO3 - 如何在没有 Transl.Orig 的情况下显示已翻译的新闻?
- python - 使用外推/插值调整数组大小
- elasticsearch - Elasticsearch 6 映射创建抛出错误
- matlab - 如何规划从点 1 到点 2 的路径,使其保持在指定区域?
- javascript - 使用 flexbox 垂直对齐内容
- c# - Xamarin.Forms:独立于平台的应用程序菜单
- ios - 如何将数据从一个视图控制器传递到另一个在 json 中获取并需要在 tableview 中设置的视图控制器?
- r - 在R中循环,提取输出的最后一行