c++ - 使用 memory_order_relaxed 如何在典型架构上保证原子变量的总修改顺序?

标签 c++ thread-safety memory-barriers memory-model stdatomic

据我所知,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/

相关文章:

c++ - 无法在 MinGW 中链接 libpqxx

Java - 使用 ConcurrentLinkedDeque 避免 NonSuchElementException

c - 两个函数之间的 Malloc 可访问性

c# - 内存屏障生成器

c++ - 编译器屏障的目的是什么?

c++ - 在 C++ 中定义数组大小

c++ - 将对象传递给多线程对象Qt

c++ - c++ 单例在使用互斥锁时是否需要内存屏障?

c++ - Linux 上 Poco::Logger 的编译器错误 - 函数声明被视为宏

java - 无法使用 Poison Pill 停止生产者/消费者线程