5

我有std::atomic<int>* key, *val;

我想给两者都写信。有多个线程同时读取这些值。我想确保 val 写在 key 之前。这是确保如果读者看到 key 的新值,他们也必须看到 val 的新值。用旧键查看新 val 或查看两个旧值都很好。代码必须在宽松的处理器架构 (ARM) 上运行。

val->store(x, relaxed), key->store(y, release)通常,执行 (in-order)并使用 (in-order) 加载它们就足够了key->load(acquire), val-load(relaxed)。在 ARM 上,我相信获取插入了一个负载屏障,而释放插入了一个存储屏障。但是,由于各种原因,我没有使用 atomic 来读取 val,并且在每次读取访问时使用屏障会太昂贵。

是否可以在两个商店之间仅使用商店屏障(x86 上的 sfence)来强制订购?请记住,看到 key 和 val 的陈旧值是非常好的,我要确保的是,如果另一个核心看到 key 的新值,它也必须看到 val 的新值。读者总是先读取 key 并且 val 的读取取决于 key 的值(即使它的内存地址也是如此),所以我不相信编译器或处理器都可以重新排序负载使得 val 是在关键之前阅读。它必须读取 key 才能知道在哪里寻找 val。我怀疑正是这个属性允许代码在没有负载障碍的情况下工作。

我对吗?

4

0 回答 0