gpt4 book ai didi

c++ - MOV x86 指令是否实现 C++11 memory_order_release 原子存储?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:21:10 26 4
gpt4 key购买 nike

根据这个https://www.cl.cam.ac.uk/~pes20/cpp/cpp0xmappings.html ,已释放的存储在 x86(包括 x86-64)上实现为 MOV(进入内存)。

根据他的http://en.cppreference.com/w/cpp/atomic/memory_order

memory_order_release:

A store operation with this memory order performs the release operation: no memory accesses in the current thread can be reordered after this store. This ensures that all writes in the current thread are visible in other threads that acquire or the same atomic variable and writes that carry a dependency into the atomic variable become visible in other threads that consume the same atomic.

我理解当使用memory_order_release 时,之前完成的所有内存存储应该在此之前完成。

int a;
a = 10;
std::atomic<int> b;
b.store(50, std::memory_order_release); // i can be sure that 'a' is already 10, so processor can't reorder the stores to 'a' and 'b'

问题:一个简单的 MOV 指令(没有明确的内存栅栏)怎么可能足以满足这种行为? MOV 如何告诉处理器完成所有先前的存储?

最佳答案

在运行时内存重新排序(由 CPU 完成),在编译时内存重新排序。请阅读Jeff Preshing's article on compile-time reordering (以及该博客上的许多其他好文章)以获取更多信息。

memory_order_release 防止编译器重新排序数据访问,以及发出任何必要的防护或特殊指令。在 x86 asm 中,普通的加载和存储已经具有获取/释放语义,因此阻止编译时重新排序对于 acq_rel 来说就足够了,但对 seq_cst 来说就足够了。

关于c++ - MOV x86 指令是否实现 C++11 memory_order_release 原子存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29922747/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com