为什么并发测试很难:非确定性与时序爆炸
副标题 / 摘要 并发测试困难的根源在于非确定性与时序组合爆炸。本文解释为什么难、难在哪里,并给出工程实践建议。 目标读者 做并发/多线程开发的工程师 负责可靠性与测试的团队 想理解“偶发 bug”为何难测的人 背景 / 动机 并发 bug 往往“偶发、难复现、线上才出现”。 这是因为并发调度不可预测,导致测试难以覆盖所有时序组合。 核心概念 非确定性:调度顺序不可预测 时序组合爆炸:线程交错排列数量巨大 Heisenbug:调试本身改变时序 可复现性:复现条件苛刻 实践指南 / 步骤 把并发边界缩小(减少共享状态) 引入确定性调度或模拟器 使用竞态检测工具(如 TSAN) 加大压力与重复运行(概率提高) 记录关键事件与时间线 可运行示例 下面例子展示“偶发错误”很难稳定复现: import threading x = 0 def worker(): global x for _ in range(100000): x += 1 if __name__ == "__main__": threads = [threading.Thread(target=worker) for _ in range(2)] for t in threads: t.start() for t in threads: t.join() print(x) 在某些语言/环境下会出现不一致结果,这就是并发非确定性。 解释与原理 并发执行时,读-改-写不是原子操作。 调度顺序变化会导致结果不同,而这类问题很难通过少量测试覆盖。 ...