如何解决compare_exchange_strong/weak 是否可以看到较旧的值?
我实现了一个并发算法,其中我使用了大量的比较和交换。现在,我想通过处理内存排序来优化吞吐量,这让我想到了一些特定的问题。它基本上归结为以下代码结构:
atomic_int x = 0;
void thread1() {
int a = atomic_load_explicit(&x,memory_order_relaxed);
compare_exchange_strong_explicit(&x,&a,1,memory_order_relaxed,memory_order_relaxed);
a = atomic_load_explicit(&x,memory_order_relaxed);
}
void thread2() {
int a = 0;
compare_exchange_strong_explicit(&x,2,memory_order_relaxed);
}
现在假设线程 2 的 compare_exchange 成功,线程 1 加载旧值 0 的情况仍然可能发生。但是,第一个线程的 compare-exchange 是否也会成功,因为底层操作仍然看到旧(预期)值?
如果不是,那么在这种情况下,比较交换肯定会失败。但是第二次加载呢? 由于宽松的内存排序,它还能读取旧值吗? compare_exchange 是否“强制”刷新此特定线程的内存子系统?
提前致谢!
解决方法
对特定原子对象的所有原子操作都保证对每个线程以相同的所谓对象修改顺序可见,即它们始终一致地出现。 (否则,无论如何,原子的整个想法对我来说都没有多大意义。)
另一方面,当单个线程准确感知更改时,完全取决于“实现”,即编译器和/或运行时。因为架构与您所期望的有很大不同,这里,这是 C 标准所说的“实现质量”问题,也就是说,如果您认为它们是,您必须向编译器编写者或芯片构造函数抱怨太慢了,例如
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。