核心概念
競態條件(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兩個執行緒在同一個餘額上交錯執行,有一筆取款悄無聲息地消失了。
它們出了名的「在我機器上沒問題」——往往只在真實負載下才現身,在除錯器的平靜裡卻怎麼都抓不到。
又稱
另見