使用缓存一致性协议为什么无法解决多线程同步问题

**

使用缓存一致性协议为什么无法解决多线程同步问题

首先我们来看缓存一致性协议和多线程同步分别作用的对象是什么,很明显从他们的名字就可以看出来,一个是作用于CPU(缓存),一个作用于线程。
那么CPU(缓存)和线程之间又有什么关系呢?

他们之间的关系就是:多个CPU上同时跑的,肯定是不同线程,但是不同的线程,可以跑在同一个CPU上。也就是说,多线程同步与CPU核数无关,而CPU(缓存)一致性,要解决的是CPU之间的同步问题,而不是线程之间的同步问题

至于他们之间解决的是什么问题,下面我们再进一步的探讨。因为线程是先于CPU多核出现,所以我们先探讨线程同步问题。

为了简化整个模型,我们可以先假设只有一颗CPU core0在运行,然后A和B线程同时在这个core0上运行。然后A和B线程同时执行x = x+1操作(x初始化值为0)。当A线程把x值(=0)从内存读到寄存器后,就被CPU给中断掉,并让出CPU给到线程B,然后线程B读取了x=0,并进行了x+1计算,最后赋值给x,写入内存x(=1),随后CPU唤醒A线程,并继续上一次的执行x + 1并赋值给x,写入内存x(=1)。可以看到,在单core场景下,是没有缓存一致性问题的,但是依旧有多线程间的数据一致性问题,此时也就是多线程同步发挥的地方。而多线程同步,通过使用临界区(如同步代码块)、信号量和管程等方式,来避免这种因为”错误“中断而产生的不一致问题,具体到操作系统,就是屏蔽中断、锁方式等。

然后同样的上述场景,我们再看看多核CPU下的情况。我们假设线程A运行在core0,线程B运行在core1。他们分别开启中断屏蔽,然后将x分别读入到自己的cache中,然后完成上述的x+1运算,最终分别将1写入到内存x的位置。可以看到,在这种场景下,其实是无法实现多线程同步的——哪怕已经使用了同步手段。这个主要是因为多个cache的数据本身出现了并发修改问题,且没有用任何手段来保证其一致性,因此缓存一致性协议就是为了解决这个问题而出现的。

总结来说,多线程同步是一种线程级别间的一致性保证,而缓存一致性是在多CPU的场景下,为了实现多线程同步而采取的一种技术手段
文章转载自https://www.zhihu.com/question/277395220

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值