小编Chr*_*all的帖子

C11 Atomic Acquire/Release 和 x86_64 缺乏加载/存储一致性?

我正在努力处理 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)

c x86-64 memory-model memory-barriers stdatomic

10
推荐指数
1
解决办法
259
查看次数

`atomic_compare_exchange_strong_explicit()` -- 当不相等时,`success` 和 `failure` 参数的各种组合会做什么?

atomic_compare_exchange_strong_explicit()函数采用两个memory_order参数successfailure(与 一样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。可能是也可能不是 …

c assembly atomic stdatomic

3
推荐指数
1
解决办法
524
查看次数

标签 统计

c ×2

stdatomic ×2

assembly ×1

atomic ×1

memory-barriers ×1

memory-model ×1

x86-64 ×1