1.缓存一致性问题,如何解决?
当程序在运行过程中,会将运算需要的数据从主存复制一份到 CPU 的高速 缓存当中,那么 CPU 进行计算时就可以直接从它的高速缓存读取数据和向其中 写入数据,当运算结束之后,再将高速缓存中的数据刷新到主存当中。
比如下面的这段代码: i = i+1
比如同时有 2 个线程执行这段代码,假如初始时 i 的值为 0,那么我们希望 两个线程执行完之后 i 的值变为 2。
可能存在下面一种情况:初始时,两个线程分别读取 i 的值存入各自所在的 CPU 的高速缓存当中,然后线程 1 进行加 1 操作,然后把 i 的最新值 1 写入到 内存。此时线程 2 的高速缓存当中 i 的值还是 0,进行加 1 操作之后,i 的值为 1,然后线程 2 把 i 的值写入内存。 最终结果 i 的值是 1,而不是 2。这就是著名的缓存一致性问题。通常称这 种被多个线程访问的变量为共享变量。
也就是说,如果一个变量在多个 CPU 中都存在缓存(一般在多线程编程 时才会出现),那么就可能存在缓存不一致的问题。
解决的方法:
1)通过在总线加 LOCK#锁的方式
因为 CPU 和其他部件进行通信都是通过总线来进行的,如果对总线 加 LOCK#锁的话,也就是说阻塞了其他 CPU 对其他部件访问(如内存), 从而使得只能有一个 CPU 能使用这个变量的内存。比如上面例子中 如果一个 线程在执行 i = i +1,如果在执行这段代码的过程中,在总线上发出了 LCOK# 锁的信号,那么只有等待这段代码完全执行完毕之后,其他 CPU 才能从变量 i 所在的内存读取变量&