竞争条件
竞争条件发生在多个进程尝试使用共享数据,并且它的结果是依赖于进程运行的顺序。因为无论是显示还是隐式调用fork函数逻辑之后都无法确定先运行父进程还是子进程,所以在使用fork函数的地方经常发生竞争条件。即使知道哪个进程先运行,这也是依赖于系统加载和内核的调度算法。即使是使用了sleep函数也无法保证父、子进程哪个选运行,因为当系统负载很重的时候,进程可能忽略sleep函数。这很难DEBUG,因为进程都趋于“更多时间”的运行。
一个进程想接收它的子进程结束信息,就必须调用wait函数的一个版本。一个进程想等待它的父进程结束信息,可能要调用下面循环的形式:
while (getppid() != 1)
sleep(1);
|
这类循环被称作polling,它很费CPU时间,因为每秒都要测试一次条件。
为了避免竞争条件和polling,在多个进程间需要某种形式的信号。
本节重点:避免竞争条件出现,它会使程序的运行结果不稳定,因为竞争条件是依赖于系统加载和内核的调度算法的。