据我所知,memory_order_relaxed
是为了避免昂贵的内存栅栏,这可能需要在特定架构上进行更多约束排序。
在那种情况下,如何在流行的处理器上实现原子变量的总修改顺序?
编辑:
atomic<int> a;
void thread_proc()
{
int b = a.load(memory_order_relaxed);
int c = a.load(memory_order_relaxed);
printf(“first value %d, second value %d\n, b, c);
}
int main()
{
thread t1(thread_proc);
thread t2(thread_proc);
a.store(1, memory_order_relaxed);
a.store(2, memory_order_relaxed);
t1.join();
t2.join();
}
什么能保证输出不会是:
first value 1, second value 2
first value 2, second value 1
?
最佳答案
多处理器经常使用MESI protocol以确保某个地点的总商店订单。信息以高速缓存行粒度传输。该协议(protocol)确保在处理器修改高速缓存行的内容之前,所有其他处理器放弃他们的行拷贝,并且必须重新加载修改后的行的拷贝。因此,在处理器将 x 然后 y 写入同一位置的示例中,如果任何处理器看到 x 的写入,它必须从修改后的行重新加载,并且必须在写入者写入 y 之前再次放弃该行。
关于c++ - 使用 memory_order_relaxed 如何在典型架构上保证原子变量的总修改顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58827774/