各位下午好,欢迎来到“代码背后的物理世界”讲座现场。 我是你们的领队,今天我们要去的地方有点冷,有点硬,而且有点吵——那就是共享内存。 在座的大概有90%的人写过共享内存的代码。通常我们都是怎么写的?像这样: // 伪代码示意 int shared_counter = 0; void writer() { shared_counter++; // 看起来很安全,对吧? } void reader() { int val = shared_counter; printf(“%dn”, val); } 如果你觉得这就结束了,那你可能是在和一个幻影搏斗。在操作系统的课堂上,我们叫它“并发竞态条件”。但在物理世界的舞台上,这简直就是一场车祸现场。你脑子里想的是“加一”,但硬件现实是“打架”。 今天,我们不谈虚的,我们要像拿着显微镜一样,去解剖一下当原子操作介入海量缓存同步时,究竟发生了什么。 第一幕:大厨的争吵 想象一下,你有一张桌子,桌上放着一张巨大的账单,上面写着“总计:100元”。 现在,有两个大厨,大厨A和大厨B,他们没有手机,只能通过在桌上写字来交流。 大厨A心想:“我要加10元。” …