我想知道假设它使用最严格的内存模型设置,修改 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/