模塊 A 向模塊 B 發送攜帶用戶號碼與序列號的消息,發送後休眠一段時間才將用戶號碼存入全局變量。模塊 B 極快返回消息,導致模塊 A 在比對時全局變量尚未賦值(為空),致使 strncmp 失敗。
send() → sleep() → copy_to_global(),而模塊 B 在 sleep 期間已返回。sleep 後問題消失。時序設計缺陷:全局變量賦值在發送之後、休眠之前,導致竄態條件。
// 修改前
send(msg);
sleep(DELAY);
copy_to_global(seq, user_id);
// 修改後
copy_to_global(seq, user_id); // 先存全局
send(msg);
sleep(DELAY); // 休眠不再影響賦值
Bug 不可怕,可怕的是沒有系統性的排查方法。掌握方法,才能「以不變應萬變」。