步骤 3 / 9
动手:亲手排一次交错,让更新丢掉
计数器从 0 开始,按“T1 读、T2 读、T1 写、T2 写”执行,两次加 1 后结果是 1;加锁后一定是 2。
右边每个线程有三个操作:读(把计数器读进自己的寄存器)、加(寄存器 + 1)、写(写回计数器)。你可以拖动它们决定执行顺序。 计数器初值 0。试这个顺序:T1 读到 0,T2 也读到 0;T1 加 1 写回 1;T2 也加 1 写回 1。两个线程各加了一次,结果却是 1,丢了一次更新。 注意关键不在“同时”,而在 T2 读的时刻 T1 还没写回。只要两个“读”都落在两个“写”之前,就会丢。 再把“使用锁”打开:T1 拿锁后,T2 的读必须等 T1 写完、放锁才能开始,任何顺序最后都是 2。 可以试试:把顺序改成 T1 读、T1 写、T2 读、T2 写,不加锁也是 2。这就是竞态难复现的原因:大多数时候恰好没撞上。