这个循环是否正忙着等待,我认为等待呼叫会解决这个问题。如果是,如何解决不忙等待?
id = fork();
for (i = 0; i < 20; i++)
{
switch (id)
{
case 0:
/* do stuff with child */
exit(0);
default:
{
if (children>=3) {
int s;
wait(&s);
children--;
}
children++;
id = fork();
}
}
}
答案 0 :(得分:3)
wait
将导致内核选择未标记为已阻止的其他作业,因此这不是忙等待的情况。对于fork()也没有过多的切换,为什么不使用简单的if语句?
答案 1 :(得分:1)
你是对的,wait
通过将CPU移交给内核直到孩子退出来等待非忙碌。
答案 2 :(得分:1)
它并不是真正购买等待(它不会在循环中检查子节点的状态;而是在wait()
调用内的块中)。
尽管如此,代码可以根据do stuff with child
中发生的情况占用CPU。这看起来像忙碌的等待(CPU使用率100%),即使它确实是几个进程正在进行实际工作。
答案 3 :(得分:1)
我同意你的看法,等待一个孩子的死亡(即使在一个循环内)也不会忙着等待。 OTOH如果一个或多个子进程是计算密集型的,你可能会遇到麻烦。计算密集型子项将始终可以运行,并且无法保证父级将获得CPU。