std::atomic 和多核处理器

Posted

技术标签:

【中文标题】std::atomic 和多核处理器【英文标题】:std::atomic and multicore processors [duplicate] 【发布时间】:2016-07-04 19:29:05 【问题描述】:

假设我有一个std::atomic<long> 变量,以及两个都写入该变量的线程。我有一台多核机器,所以这两个线程真正并发运行。

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

【问题讨论】:

您是否在问std::atomic 是如何在您的架构、操作系统和编译器上实现的?我们宁愿必须知道那些东西是什么...... 该机制使用std::atomic<long>,它确保在这种情况下一个线程首先写入,另一个线程在第二个写入。如果你的意思是问如何在汇编器中实现它,答案也很无聊:有指令可以做到这一点。 这些机制取决于你的实现(即你的操作系统和编译器和硬件) 你为什么在乎呢?只需按照标准编写代码,将 C++ 视为黑匣子,就可以了。如果您真的问“std::atomic 保证是原子的吗?”那么答案是,嗯,是的!这就是它的目的。 @Wad 简而言之:它永远不会出现在完全相同的时间,因为这是通过适当的硬件机制来防止的。 【参考方案1】:

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

#include <atomic>

std::atomic<long> x;

void foo()

  x += 1;

这个汇编器的结果:

foo():
        lock addq       $1, x(%rip)
        ret

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

【讨论】:

谢谢理查德。我并没有完全遵循这一点。如果两个处理器同时执行lock addq 行会发生什么,或者这不可能? 嗯,我找到了here:在多处理器:环境中,LOCK# 信号确保处理器在信号被断言时独占使用任何共享:内存。 - 你听上去对吗? @wad 处理器之间有信号通路(把它想象成一个硬件互斥体),所以一个会停止,而另一个会更新这个内存区域。所以这两次内存更新将依次发生。它实际上比这更复杂,处理器和缓存电路非常复杂,并且尽可能努力不停止。然而,这是一个比我们有空间(或时间)更长的主题:) @Wad 是的,作为一个高级解释。

以上是关于std::atomic 和多核处理器的主要内容,如果未能解决你的问题,请参考以下文章

多核CPU的主频怎么算

多核处理器的频率是怎样计算的?

同构多核和异构多核简单介绍

从多核到众核处理器

国产CPU性能测试:多核华为排第一,单核兆芯排第一

怎么让apache利用多核CPU进行并发的问