竞态条件(race condition)
竞态条件(race condition)指的是两个或者以上进程或者线程并发执行时,其最终的结果依赖于进程或者线程执行的精确时序。竞争条件会产生超出预期的情况,一般情况下我们都希望程序执行的结果是符合预期的,因此竞争条件是一种需要被避免的情形。
竞争条件分为两类:
- Mutex(互斥):两个或多个进程彼此之间没有内在的制约关系,但是由于要抢占使用某个临界资源(不能被多个进程同时使用的资源,如打印机,变量)而产生制约关系。
- Synchronization(同步):两个或多个进程彼此之间存在内在的制约关系(前一个进程执行完,其他的进程才能执行),如严格轮转法。
要阻止出现竞态条件的关键就是不能让多个进程/线程同时访问那块共享变量。访问共享变量的那段代码就是临界区(critical section)。所有的解决方法都是围绕这个临界区来设计的。
想要成功的解决竞态条件问题,保证程序可以正确的按逻辑顺序运行,从理论上应该满足以下四个条件:
- 不会有两个及以上进程同时出现在他们的critical section。
- 不要做任何关于CPU速度和数量的假设。
- 任何进程在运行到critical section之外时都不能阻塞其他进程。
- 不会有进程永远等在critical section之前。