核心概念

竞态条件(race condition)

/ RAYSS kun-DISH-un /

竞态条件(race condition)是一类 bug:最终结果取决于两件事里哪一件先完成——而你又控制不了它们的先后时机,于是结果每次跑都可能不一样。它十次里有九次都好好的,然后毫无征兆地失败一次,正是最让人抓狂、最难定位的那种 bug。

想象两个人共用一个银行账户,在同一瞬间各取 100 块。两人都查了余额(150),都觉得「够」,都取了款——结果账户透支了。单看任何一个人都没做错;问题在于他们「抢着」对同一个数字下手,谁都还没来得及结束。

只要有两段工作同时进行、又碰了同一样东西,这类 bug 就会潜伏其中——两个线程、两个请求、两次点击都算。修法是确保同一时刻只有一个能动手,或者干脆把设计改成「谁先谁后真的无所谓」。它们之所以难缠,恰恰是因为你一放慢速度想看清楚,它往往就消失了。

balance = read()      # both threads read 150
if balance >= 100:    # both see 'enough'
    write(balance-100)  # both write 50 — but 100 vanished

两个线程在同一个余额上交错执行,有一笔取款悄无声息地消失了。

它们出了名的「在我机器上没问题」——往往只在真实负载下才现身,在调试器的平静里却怎么都抓不到。

又称
racetiming bugdata raceconcurrency bug