我有std::atomic<int>* key, *val
;
我想写两个。有多个线程同时读取这些值。我想确保在key之前写入val。这确保了如果读者看到key的新值,他们还必须看到val的新值。可以使用旧密钥查看新的val,或查看两个旧值。代码必须适用于宽松的处理器体系结构(ARM)。
通常情况下(按顺序)val->store(x, relaxed), key->store(y, release)
就足够了(按顺序)key->load(acquire), val-load(relaxed)
加载它们。在ARM上,我相信获得插入一个负载屏障并释放插入商店屏障。但是,出于各种原因,我没有使用原子来读取val,并且在每次读取访问时使用屏障会太昂贵。
是否可以在两个商店之间仅使用商店屏障(x86上的sfence)来强制订购?记住看到key和val的过时值非常好,我想要确保的是,如果key的新值被另一个核看到,它还必须看到val的新值。读取器总是首先读取密钥,而val的读取取决于密钥的值(即使它的内存地址是),所以我不相信编译器或处理器可以重新排序负载,这样val就是在钥匙前读。它必须读取密钥甚至知道在哪里寻找val。我怀疑是这个属性允许代码在没有负载障碍的情况下工作。
我是对的吗?