x86具有原子和非原子并发读写的行为

时间:2018-08-15 23:43:47

标签: c++ concurrency x86 atomic undefined-behavior

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位)

两个相关问题-

  • x86描述这种情况的行为是什么?
  • 在这种情况下,write()函数需要做什么以破坏上面的代码? write()中的读/写宽度可以是任意值,不一定限于64位,但是要假设有足够的填充使其占用64位。 write()也可以执行原子操作。

上下文:我工作的地方有执行此操作的代码,目前似乎没有任何问题,我很确定这是不好的代码并且在某些情况下可能会崩溃。但是,我一般对x86和硬件了解不多。我想深入了解此行为,弄清楚这是否是一个问题,并有可能解决该问题。 x86的强大参考(ARM也会这样做)会很棒。

0 个答案:

没有答案