-noUser-

雨中漫步~

职业:
签名:
2021-04-28 16:38 选择满意答案 volatile、缓存一直性协议问题
2021-04-28 15:26 发表了评论 B线程不知道怎么输出是42呢
2021-04-28 15:11 发表了评论 老师您说:“所有的CPU都对Invalid响应后,再把共享变量的值从Store Bufferes里拿出来”,如果某一条没有相应导致不能刷主存,但是其中一个回复Invalid响应的CPU又去对这个变量更改,那就获取不到最新的了。 我了解的是用了Store Bufferes跟失效队列后就不用接受其他cpu回复Invalid的消息了。而是通过延迟的屏障来做: 写屏障 Store Memory Barrier(a.k.a. ST, SMB, smp_wmb)告诉处理器在写屏障之前的所有已经存储在存储缓存(store bufferes)中的数据同步到主内存,简单来说就是使得写屏障之前的指令的结果对写屏障之后的读或者写是可见的。。 读屏障Load Memory Barrier (a.k.a. LD, RMB, smp_rmb)是一条告诉处理器在执行任何的加载前,先检查所有已经在失效队列中的失效操作的指令,失效则再去主内存读取。 这样针对第四题(题目不一样)有一段我加注解的代码,但是这个前提是需要不加volatile也可以用mesi。所以下题注解这个是我自己的判断: public class ReSortDemo { int value; boolean isFinish; void cpu0(){ // 假设value不加volatile 也能满足一致性协议记录到store bufferes value = 10;//S->I状态,将value写入store bufferes,通知其他CPU当前value的缓存失效 storeMemoryBarrier();//伪代码,插入一个写屏障,使得value=10这个值强制写入主内存 isFinish=true;//E状态 } void cpu1(){ if (isFinish){//true // 读屏障发现 失效队列 中value,则从主存获取最新的value loadMemoryBarrier();//伪代码,插入一个读屏障,强制cpu1从主内存中获取最新数据 System.out.println(value == 10);//true } } }
2021-04-28 14:54 发表了评论 不考虑volatile,就是问cpu的缓存一致性协议本身就是生效的还是不生效的呢,不太明确呢
2021-04-28 14:52 发表了评论 如果不加volatile缓存一致性协议不生效,那么线程A改为42不会立马刷到主内存,线程B怎么知道的。
2021-04-28 14:19 发布提问 volatile、缓存一直性协议问题
个人成就
发布问题数:
1 个
发布文章数:
0 篇
答案被采纳数:
0 次
评论次数:
0 次
帮助
关注数: 关注的问题和作者的总数
收藏数: 收藏的问题和文章的总数