最近看资料学习时遇到几个不太懂的问题,来请教大家一下。
1. cpu缓存锁与缓存一致性协议(或者说它的具体实现MESI)是什么关系,我有发现另一篇文章说,缓存锁是基于缓存一致性协议实现的。 那它们两个之间关系是什么,看到很多文章里面说为了解决缓存不一致问题,有几种方案:有说总线锁加缓存锁,有的说总线锁加缓存一致性协议;有点晕。
2. volatile无法保证原子性这一点上,还不是很理解。借如,现在有两个线程a、b。程序要执行的操作是i++。现在a、b线程同时操作,将i的值都读到了a、b线程各自的缓存行中了。然后开始计算,a线程、b线程开始计算,计算完后数据回写到各自线程Store Bufferes中,通过缓存一致性发送Invalidate消息给其它处理器,等待回执并改变各自缓存的状态为Exclusive,然后将数据从Store Bufferes回写到缓存中。那问题来了:
a.这里面a,b两个线程咋处理? 都收到了Invalidate消息来失效自己的缓存,要独占。
b.假如这里面只有一个线程成功独占缓存(线程a成功),这个时候线程a i++操作成功执行,并完成操作回写到主内存。那线程b会怎么样,计算后的数据在Store Bufferes中,回写发现缓存失效了Invalid,无法回写,这个时候,线程b会怎么样?是重新读取一次i的数据,然后再计算,还是直接把计算后的数据丢失了?