加上 release / acquire:同一段代码为什么读到 42 1 2 3 4 4 5 6 7 // 开始时:data = 0,ready = false // 核 0(写) data = 42; ready.store(true, release); // 核 1(读) while (!ready.load(acquire)) {} use(data); // 读到 42 核 0 · 写方 写 data,再 release 写 ready invalidate queue store buffer 这次没用上 data = 42 ready = 1 data 等 ACK release:ready 排在 data 后面 按顺序写进 L1D,已清空 L1D(本核私有) data 0 S data 42 M data 42 S ready 0 E ready 1 M ready 1 S L2(本核私有) 核 1 · 读方 acquire 读 ready,再读 data invalidate queue store buffer invalidate:data 已回 ACK,还没处理 acquire:排着的请求已处理完 这次没用上 L1D(本核私有) data 0 S data 0 S 作废还在排队 data — I 已作废 data 42 S 重新取到 42 ready 无 I ready 1 S L2(本核私有) 1 2 3 4 ready 的行转给核 1 5 data 的行转给核 1 7 acquire:先清队列 6 片上互连(环或网格):Read、RFO、invalidate 请求、ACK、缓存间转发的整条行,都走这里 L3(全核共享)+ snoop filter snoop filter 记着每一行在哪些核里,invalidate 请求只发给有副本的核。 新值不会被推过去:ready 和 data 都是核 1 自己来取的(第 5、7 步)。

M已修改E独占S共享I无效