MESI问题

有一个变量a=0;有两个线程同时在多核环境下去执行a++去更改这个变量。 按照缓存一致性是不是应该是这样一个过程:两个cpu都把a读到缓存,此时a是一个S的状态,现在两个cpu都要去修改a,但是只能有一个cpu(假设是cpu1)把a修改为M状态,另一个会变为I(失效状态),当cpu2再要去执行a++的时候,会去主存读取a(因为缓存中的a已经是失效状态),这就会先触发cpu1缓存中的M状态的a(此时a=1)写回主存,然后cpu2才会读取到主存中a=1到缓存,这时两个cpu缓存中的a都变成S状态,然后cpu2再去做修改。---------过程如果是这样的话,最后输出的a一定是2了(测试结果并不是-。-)。

全部评论
你自己举的例子就已经说明不保证原子性了,我感觉你是对原子性的概念理解错了
点赞 回复 分享
发布于 2020-06-15 18:54
+1操作是三个操作
点赞 回复 分享
发布于 2020-06-15 18:56
我觉得应该从失效化队列和写缓存器角度考虑吧。 “有一个cpu(假设是cpu1)把a修改为M状态,另一个会变为I(失效状态)”:cpu1修改了a的值之后,会给总线中发送消息,要求其他CPU把他们高速缓存中a的状态置为I。但是其他CPU收到消息后,为了提高响应效率,是把这个a放入失效化队列,然后就立刻给出回复,表示自己已经把a置成I了,其实缓存条目的修改是要滞后的。 写缓存器也是一样的,对于CPU1来说,要修改a的值,不是马上在高速缓存修改,而是把a的新值写入写缓存器, 从写缓存器同步到高速缓存还需要一点时间。  因为写缓存器和失效化队列是每个内核独有的,不能互相访问,所以会出现在CPU1已经修改了a的值的情况下,CPU2依然读到了旧的a的值。
点赞 回复 分享
发布于 2020-06-15 21:44

相关推荐

勇敢的联想人前程似锦:如果我是你,身体素质好我会去参军,然后走士兵计划考研211只需要200多分。
点赞 评论 收藏
分享
10-11 17:45
门头沟学院 Java
走吗:别怕 我以前也是这么认为 虽然一面就挂 但是颇有收获!
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务