x86的这种行为是什么?
template <typename Integer>
void write(Integer&);
auto integer = std::uint64_t{0};
auto atomic = reinterpret_cast<std::atomic<std::uint32_t>*>(&integer);
auto one = std::thread{[&]() {
write(integer);
}};
auto two = std::thread{[&]() {
read(atomic.load());
}};
x86中的32位原子负载被编译为此(以某种方式生成的程序集不包括锁前缀)
mov edi, DWORD PTR [rdi]
(假设little-endianness,它将原子整数放在正确的位置以观察64位整数中的最低有效32位)
两个相关问题-
write()
函数需要做什么以破坏上面的代码? write()
中的读/写宽度可以是任意值,不一定限于64位,但是要假设有足够的填充使其占用64位。 write()
也可以执行原子操作。 上下文:我工作的地方有执行此操作的代码,目前似乎没有任何问题,我很确定这是不好的代码并且在某些情况下可能会崩溃。但是,我一般对x86和硬件了解不多。我想深入了解此行为,弄清楚这是否是一个问题,并有可能解决该问题。 x86的强大参考(ARM也会这样做)会很棒。