Elo*_*off 5 c++ memory-fences lock-free
我有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.我怀疑是这个属性允许代码在没有负载障碍的情况下工作.
我对吗?