-
Cadence入门教程-竞态条件
资源介绍
8.8 竞态条件
从本书的目的出发,当多个进程都企图对共享数据进行某种处理,而最后的结果又取决于
进程运行的顺序时,则我们认为这发生了竞态条件( race condition)。如果在f o r k之后的某种逻
辑显式或隐式地依赖于在 f o r k之后是父进程先运行还是子进程先运行,那么 f o r k函数就会是竞
态条件活跃的孳生地。通常,我们不能预料哪一个进程先运行。即使知道哪一个进程先运行,
那么在该进程开始运行后,所发生的事情也依赖于系统负载以及内核的调度算法。
在程序8 - 5中,当第二个子进程打印其父进程 I D时,我们看到了一个潜在的竞态条件。如
果第二个子进程在第一个子进程之前运行,则其父进程将会是第一个子进程。但是,如果第一
个子进程先运行,并有足够的时间到达并执行 e x i t,则第二个子进程的父进程就是 i n i t。即使在
程序中调用 s l e e p,这也不保证什么。如果系统负担很重,那么在第二个子进程从 s l e e p返回时,
可能第一个子进程还没有得到机会运行。这种形式的问题很难排除,因为在大部分时间,这种
问题并不出现。
如果一个进程希望等待一个子进程终止,则它必须调用 w a i t函数。如果一个进程要等待其
父进程终止(如程序8 - 5中一样),则可使用下列形式的循环:
while(getppid() !=1)
s l e e p ( 1 ) ;
这种形式的循环(称为定期询问( p o l l i n g))的问题是它浪费了C P U时间,因为调用者每隔1秒
都被唤醒,然后进行条件测试。
为了避免竞态条件和定期询问,在多个进程之间需要有某种形式的信号机制。在 U N I X中
可以使用信号机制,在 1 0 . 1 6节将说明它的一种用法。各种形式的进程间通信 ( I P C )也可使用,
在第1 4、1 5章将对此进行讨论。
在父、子进程的关系中,常常出现下述情况。在 f o r k之后,父、子进程都有一些事情要做。
第 8章 进 程 控 制 1 5 3
- 上一篇: exit函数-cadence入门教程
- 下一篇: system函数-cadence入门教程