2010-11-05 64 views
3

这个循环是否忙着等待,我认为等待电话会处理这个问题。如果是这样,那么如何解决不忙等待呢?这是忙碌的等待吗?

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

回答

3

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

1

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

1

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

尽管如此,代码可以支配CPU,具体取决于do stuff with child中发生的情况。这看起来像忙着等待(CPU使用率100%),即使它真的是几个进行实际工作的进程。

1

我同意你的观点,等待一个孩子的死亡(即使在一个循环内)也不会等待。如果一个或多个子进程计算密集,OTOH可能会遇到麻烦。计算密集型儿童将始终准备好运行,并且不保证父代会获得CPU。