多个叉()并发(Multiple fork() Concurrency)

2019-07-04 22:14发布

你怎么这样,你可以生成10个进程,让他们做一个小任务并行的方式使用fork()的命令。

并发是最关键的词,很多地方显示如何使用叉只使用一个电话在其演示叉()。 我以为你会使用某种形式的for循环,但我想,它似乎在我的测试中,该叉()'s的产卵一个新的进程,做的工作,然后产生一个新的进程。 因此,他们似乎是运行顺序,但我怎么能同时叉,并有10个进程做工作的同时如果是有道理的?

谢谢。

更新:谢谢你的答案的家伙,我想我只是误会叉的某些方面()开始,但我现在明白了吧。 干杯。

Answer 1:

调用fork()一个循环:

添加代码等待每个评论的孩子:

int numberOfChildren = 10;
pid_t *childPids = NULL;
pid_t p;

/* Allocate array of child PIDs: error handling omitted for brevity */
childPids = malloc(numberOfChildren * sizeof(pid_t));

/* Start up children */
for (int ii = 0; ii < numberOfChildren; ++ii) {
   if ((p = fork()) == 0) {
      // Child process: do your work here
      exit(0);
   }
   else {
      childPids[ii] = p;
   }
}

/* Wait for children to exit */
int stillWaiting;
do {
   stillWaiting = 0;
    for (int ii = 0; ii < numberOfChildren; ++ii) {
       if (childPids[ii] > 0) {
          if (waitpid(childPids[ii], NULL, WNOHANG) != 0) {
             /* Child is done */
             childPids[ii] = 0;
          }
          else {
             /* Still waiting on this child */
             stillWaiting = 1;
          }
       }
       /* Give up timeslice and prevent hard loop: this may not work on all flavors of Unix */
       sleep(0);
    }
} while (stillWaiting);

/* Cleanup */
free(childPids);


Answer 2:

当您关闭叉进程将同时运行。 但请注意,除非你有足够的可用空闲的处理器,他们可能不会真的被同时执行,这应该不是真正的问题...

你的第二个段落使它看起来就像你不理解是如何工作的叉子,你必须检查返回代码,看看,如果你是在父或派生进程。 所以,你将有父运行一个循环叉掉10个进程,并在任何你想同时做你该做的孩子。



Answer 3:

只是在回路中“主”过程中产卵一个孩子先后与各分配一个特定的任务。



Answer 4:

您可能还需要寻找到POSIX线程(或并行线程)。 这里是一个教程:

https://computing.llnl.gov/tutorials/pthreads/



文章来源: Multiple fork() Concurrency