c - 自旋等待原子变为某个值
问题描述
我想旋转等待一个原子成为某个值,然后获取存储的内存memory_order_release
。
我以为通过优化
#include <stdatomic.h>
void wait_for_flag_to_become2(_Atomic unsigned char *xp)
{
while(2!=atomic_load_explicit(xp,memory_order_acquire));
}
void wait_for_flag_to_become2_(_Atomic unsigned char *xp)
{
while(2!=atomic_load_explicit(xp,memory_order_relaxed)){}
atomic_thread_fence(memory_order_acquire);
}
将生成相同的代码并且它类似于后一个函数,但在输出程序集不同的平台上,它们不会。
上述两个函数在语义上是等价的吗?是由于简单的优化失败导致的输出程序集的差异,还是它们实际上在语义上不等价?
https://gcc.godbolt.org/z/hNcf-i
电源64-at12,gcc8:
wait_for_flag_to_become2:
.quad .L.wait_for_flag_to_become2,.TOC.@tocbase,0
.L.wait_for_flag_to_become2:
.L2:
lbz 9,0(3)
cmpw 7,9,9
bne- 7,$+4
isync
rlwinm 9,9,0,0xff
cmplwi 7,9,2
bne 7,.L2
blr
.long 0
.byte 0,0,0,0,0,0,0,0
wait_for_flag_to_become2_:
.quad .L.wait_for_flag_to_become2_,.TOC.@tocbase,0
.L.wait_for_flag_to_become2_:
.L6:
lbz 9,0(3)
cmplwi 7,9,2
bne 7,.L6
lwsync
blr
.long 0
.byte 0,0,0,0,0,0,0,0
ARM64,GCC 8.2:
wait_for_flag_to_become2:
.L2:
ldarb w1, [x0]
and w1, w1, 255
cmp w1, 2
bne .L2
ret
wait_for_flag_to_become2_:
.L5:
ldrb w1, [x0]
and w1, w1, 255
cmp w1, 2
bne .L5
dmb ishld
ret
解决方案
推荐阅读
- python - 使用日期时如何在 Altair 中为选择间隔设置初始值?
- javascript - NodeJS 异步
- embedded - exp() math.cic 在循环中不起作用
- python - 在python中使用LDA对小波尺度图进行降维
- reactjs - react.js,如何从 API 数据创建搜索过滤器?
- android - 助理 RECORD_HEALTH_OBSERVATION 缺失值
- r - Shiny Server R 会话创建一个它没有访问权限的 tempdir()
- sql - PostgreSQL 通过数组中的 JSON 对象查询
- flutter - 我如何通过其他连接的颤振应用程序交换小部件的显示数据
- android - 如何防止Android SpeechRecognizer被破坏后发出噪音?