c-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, &a, 2, memory_order_relaxed, memory_order_relaxed);
}

现在假设线程2的compare_exchange成功,那么线程1仍然可能加载旧值0然而,第一个线程的比较交换是否也能成功,因为底层操作仍然看到旧的(预期的(值

如果没有,那么在这种情况下,比较交换肯定会失败。但是第二批呢由于内存排序放松,它还能读取旧值吗?compare_exchange";"力";刷新这个特定线程的内存子系统

提前感谢!

特定原子对象上的所有原子操作都保证以相同的所谓对象修改顺序对每个线程可见,也就是说,它们总是一致地出现。(否则,原子论的整个概念对我来说毫无意义。(

另一方面,当各个线程确切地感知到变化时;实现";,即编译器和/或运行时。因为体系结构与您所期望的大不相同,在这里,这是C标准所称的";实施质量";问题是,如果你认为编译器编写器或芯片构造函数在这方面太慢,比如,你就必须向他们投诉

最新更新