【发布时间】:2019-03-09 09:03:21
【问题描述】:
在我的理解中原子操作(例如c++ atomic)首先锁定缓存行,然后执行原子操作。我有两个问题:1.如果说原子比较和交换是硬件中的原子操作本身,为什么我们需要锁定缓存线和2.当缓存线被锁定时,另一个cpu如何等待它?它使用自旋锁式等待吗?
谢谢
【问题讨论】:
-
对于多核,原子更改必须对每个核生效。由于另一个核心可能已经缓存了相同的存储,它必须使存储无效以允许它“看到”更改。恕我直言,这是一个硬件问题,它是如何详细完成的。我不确定 C++ 是否与此相关(除了它确实提供
std::atomic以允许访问该硬件功能(如果可用))。请注意std::atomic可能会退回到其他锁定,如果 H/W 锁不适用于锁定类型。std::atomic. -
这种心智模型有点过于简单,无法真正取得进展,但处理器制造商将其内存控制器视为商业机密,因此您没有很多方法可以使其更准确。每个处理器都有一种使用特定指令集自动更新内存的方法。使用这些指令,这就是 std::atomic 所做的一切。当这样的更新正在进行时,其他内核肯定可以停止,你必须有点不走运。或者编写非最优代码。
-
我只是想知道为什么当原子操作本身对硬件来说是原子操作时需要独占缓存行访问......
标签: c++ multithreading cpu atomic