竞态条件
当软件 程序依赖一个或多个 进程的时序才能正常运行时,就会发生竞态条件。如果某个 线程在出乎意料的时间运行或结束,可能会导致不可预测的行为,例如输出错误或程序 死锁。
大多数软件程序都是 多线程的,这意味着它们可以同时处理多个线程。编写良好的 应用程序会确保按照预期的顺序处理每个线程的结果。如果程序依赖以不可预测的顺序运行的线程,就可能发生竞态条件。
一个简单的例子是处理 布尔值的 逻辑门。AND 逻辑门有两个 输入和一个 输出。如果输入 A 和 B 为真,AND 门会生成 TRUE。如果一个或两个输入为假,它会生成 FALSE。如果程序在变量 A 和 B 加载之前检查逻辑门的结果,就可能发生竞态条件。正确的处理顺序应为:
- 加载变量 A
- 加载变量 B
- 检查 AND 逻辑门的结果
错误的顺序是:
- 加载变量 A
- 检查 AND 逻辑门的结果
- 加载变量 B
上面第二个例子的结果可能与第一个例子相同,也可能不同。例如,变量 B 在加载前后都可能为 FALSE,这样就不会改变结果。如果 A 为 FALSE,那么无论 B 为 TRUE 还是 FALSE,都没有关系。但是,如果 A 和 B 都为真,结果应为 TRUE。在检查逻辑门的结果后再加载变量 B,会产生错误的 FALSE 结果。
竞态条件产生的不一致输出可能导致难以检测的 错误。程序员可以通过确保按一致的顺序处理线程来避免这些问题。
测试你的知识