这忙吗?

时间:2010-11-05 14:59:33

标签: c unix

这个循环是否正忙着等待,我认为等待呼叫会解决这个问题。如果是,如何解决不忙等待?

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();
             }
    }
}

4 个答案:

答案 0 :(得分:3)

wait将导致内核选择未标记为已阻止的其他作业,因此这不是忙等待的情况。对于fork()也没有过多的切换,为什么不使用简单的if语句?

答案 1 :(得分:1)

你是对的,wait通过将CPU移交给内核直到孩子退出来等待非忙碌。

答案 2 :(得分:1)

它并不是真正购买等待(它不会在循环中检查子节点的状态;而是在wait()调用内的块中)。

尽管如此,代码可以根据do stuff with child中发生的情况占用CPU。这看起来像忙碌的等待(CPU使用率100%),即使它确实是几个进程正在进行实际工作。

答案 3 :(得分:1)

我同意你的看法,等待一个孩子的死亡(即使在一个循环内)也不会忙着等待。 OTOH如果一个或多个子进程是计算密集型的,你可能会遇到麻烦。计算密集型子项将始终可以运行,并且无法保证父级将获得CPU。