std::atomic 和多核处理器

Wad*_*Wad 1 c++ concurrency multithreading c++11

考虑到我有一个std::atomic<long>变量和两个写入变量的线程。我有一台多核机器,所以这两个线程真正并发运行。

假设写入恰好同时发生(如果可能的话),有什么机制可以确保两次写入的结果不会以任何方式交错?

Ric*_*ges 5

在使用 gcc 编译的 64 位 x86 处理器上,此代码:

#include <atomic>

std::atomic<long> x;

void foo()
{
  x += 1;
}
Run Code Online (Sandbox Code Playgroud)

结果在这个汇编器中:

foo():
        lock addq       $1, x(%rip)
        ret
Run Code Online (Sandbox Code Playgroud)

lock 是一个 x86 指令前缀,它使处理器(和内存缓存)确保指令是原子的,并且相对于其他内核的内存视图有序。

  • @wad 处理器之间有信号路径(将其视为硬件互斥体),因此一个处理器会在另一个处理器更新该内存区域时停止运行。所以这两次内存更新会依次发生。它实际上比这更复杂,处理器和缓存电路非常复杂,并且尽可能努力不停止。然而,这个主题比我们这里的空间(或时间)要长:) (2认同)