我正在努力处理 C11 标准的第 5.1.2.4 节,特别是发布/获取的语义。我注意到https://preshing.com/20120913/acquire-and-release-semantics/(以及其他)指出:
... 释放语义防止写入释放的内存重新排序与程序顺序之前的任何读取或写入操作。
因此,对于以下情况:
typedef struct test_struct
{
_Atomic(bool) ready ;
int v1 ;
int v2 ;
} test_struct_t ;
extern void
test_init(test_struct_t* ts, int v1, int v2)
{
ts->v1 = v1 ;
ts->v2 = v2 ;
atomic_store_explicit(&ts->ready, false, memory_order_release) ;
}
extern int
test_thread_1(test_struct_t* ts, int v2)
{
int v1 ;
while (atomic_load_explicit(&ts->ready, memory_order_acquire)) ;
ts->v2 = v2 ; // expect read to happen before store/release
v1 = ts->v1 ; // expect write …Run Code Online (Sandbox Code Playgroud) 该atomic_compare_exchange_strong_explicit()函数采用两个memory_order参数success和failure(与 一样atomic_compare_exchange_weak_explicit())。取消选择 C11/C18 标准,我发现success和 的允许值为failure:
success = memory_order_relaxed failure = memory_order_relaxed
success = _release failure = _relaxed
success = _consume failure = _relaxed
or _consume
success = _acquire failure = _relaxed
or _acq_rel or _consume (?)
or _acquire
success = _seq_cst failure = _relaxed
or _consume (?)
or _acquire
or _seq_cst
Run Code Online (Sandbox Code Playgroud)
标准还说:
进一步地,如果比较为真,则按照成功的值影响内存,如果比较为假,则按照失败的值影响内存。这些操作是原子读-修改-写操作 (5.1.2.4)。
您的 ARM、POWER-PC 和其他“LL/SC”设备执行 Load-Link/Cmp/Store-Conditional 序列来实现atomic-cmp-exchange,其中 Load-Link 可能会也可能不会 _acquire,而Store-Conditional 则可能是 _acquire。可能是也可能不是 …