比较和交换后CPU缓存线是否会刷新?

时间:2014-09-11 12:16:29

标签: linux c++11 kernel cpu-cache

假设有两个变量存储在同一个CPU缓存行中,如果我成功CAS中的一个变量,整个缓存行是否会在CAS指令后立即更新?

2 个答案:

答案 0 :(得分:0)

它不需要更新,它已经更新。高速缓存可见性(在正常系统和内存类型上)保证使用正常操作读取的任何高速缓存行都会产生相同的结果,就像整个内存是平坦的并且一致地更新一样。另一方面,如果您正在处理部分,WC,流媒体或任何其他不一定一致的访问,那么您将无法获得该保证。

对于锁定操作,这通常通过在高速缓存行上抓取内部锁来在硬件中实现,以便原子地执行CAS(读 - 修改 - 写),但这与高速缓存一致性是正交的。无论您执行的操作(即使在简单的存储上),任何读取操作立即“在”之后“(在同一线程上按程序顺序更小​​,或者在任何其他线程/核心上按时间顺序排列)将看到该行CAS操作后。当然,来自其他线程的访问也可能在该操作之前窥探该行并查看旧数据(取决于您的系统内存顺序和代码所采取的任何预防措施)。

答案 1 :(得分:0)

是的,它是整个缓存行的完整内存屏障。因此,如果您已在同一缓存行上更新了其他变量,然后执行原子操作,则该值将对所有其他进程/线程可见。


如果你对该缓存行上的另一个变量进行非原子更新,你仍然不能保证数据会与其他处理器同时写入相同的数据。同一缓存行上的其他变量。您的保证是关于该数据的可见性,该数据是您刚刚编写的数据或其他线程编写的内容。