c++ - 修改 C++11 atomic bool 需要多少个时钟周期?

标签 c++ performance c++11 concurrency atomic

我想知道假设它使用最严格的内存模型设置,修改 std::atomic(或 atomic_flag)需要多少个时钟周期?

最佳答案

很难准确确定实际需要多少个时钟周期。相反,我将尝试解释实际发生的情况,如果我们假设它是一个 x86 处理器(如评论中所述),并且运行时库使用“锁定”指令实现 atomic - 如果有任何这些假设是错误的,那么俗话说“所有赌注都没有了”:

当执行atomic 操作时,CPU 将首先确保它对(可能)缓存的值具有“独占”访问权限。这意味着向所有其他 CPU 发送消息说“我这个变量”。然后每个其他 CPU 都必须刷新其拷贝(如果已修改)并将该值标记为“无效”,然后回复“我完成了”。

一旦所有处理器都说“我完成了”,主处理器就可以继续。这个过程,尤其是在具有大量 CPU(核心)的大型系统中,可能需要相当长的时间(数百或数千个周期)。

当然,CPU 可以通过知道没有其他 CPU 读取这个值,或者没有其他 CPU 为这个值发出写操作来优化它,在这种情况下,它可以非常快。

你或许可以通过编写一些代码来了解这[在特定机器上]有多糟糕,你在两个线程中循环,比如 1 秒,尝试更新和读取同一个原子变量,看看它有多好/多坏。然后尝试两个“更新”循环(这样你就可以在两个线程之间进行更新)。

关于c++ - 修改 C++11 atomic bool 需要多少个时钟周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18835305/

相关文章:

xml - 如何提高基于 MQ 的批处理应用程序的性能?

java - 克隆一个 int[] ——有人有更快的建议吗?

c++ - 将 std::function 应用于访问者设计模式

java - 最小公倍数算法的速度(java)

转发到唯一方法的 C++11 重载方法

c++ - 在 C++ 中如何对一组自变量应用相同的操作?

c++ - 如何检查 MFC CString 是否为空?

c++ - 仅使用一个#include-expression 一次包含多个头文件?

c++ - 此代码示例中使用了哪种模板特化?

C++:同一对象的基类与派生类的指针比较