什么是竞争条件:Race Condition 的本质与示例

副标题 / 摘要 竞态条件是并发中最隐蔽的 bug 类型之一,源于对共享状态的非原子操作。本文给出可运行示例与规避方法。 目标读者 需要理解线程安全的工程师 做并发开发与性能优化的开发者 负责可靠性与稳定性的技术负责人 背景 / 动机 竞态条件会导致偶发错误:你很难复现,但它确实存在。 理解其成因,才能正确使用锁、原子操作与无锁结构。 核心概念 共享状态:多线程同时访问的变量 非原子操作:读-改-写不是一个不可分割的步骤 临界区:必须串行访问的代码区域 实践指南 / 步骤 识别共享状态 确定临界区 使用锁或原子操作保护 最小化临界区范围 用竞态检测工具验证 可运行示例 import threading counter = 0 def inc(): global counter for _ in range(100000): counter += 1 if __name__ == "__main__": t1 = threading.Thread(target=inc) t2 = threading.Thread(target=inc) t1.start() t2.start() t1.join() t2.join() print(counter) 在部分解释器/实现中可能输出小于 200000,这就是竞态。 解释与原理 counter += 1 并不是原子操作,它包含读取、加一、写回三个步骤。 两个线程交错执行时会丢失更新。 ...

2026年1月24日 · 1 分钟 · map[name:Jeanphilo]