首先看图

volatile关键字与CPU之间的关系
这个【x,y】被volatile修饰过了。就相当于64Byte缓存行
我理解的是:缓存行就是CPU缓存区读取数据的数据块的大小
1,当64Byte的【x,y】被缓存区L3读取后,cpu1需要更改X,cpu2需要更改Y,没办法只能全部读取,
当cpu1的X发生改变后,刷回内存,通知同时读取到这个缓存行的线程。(通知通过CPU内部的缓存一致性协议实现。)cpu2修改完后也和线程1一样。就这样来回改变,不断通知。是不是这样很傻。假如我们换个想法:不让他们读到同一个缓存行?那就把X和Y分到不同的缓存行,这样就避免了来回通知的浪费。所以让X所在在的缓存行占63Byte让Y也占64Byte,修改后也不用通知对方。
因为CPU的块性消费导致修改块中的数据要通知对方,那就把对方分在另外的数据块中。

相关文章: