多线程与并发

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 所在的内存读取变量&

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值