如何使用 fork 来计算计算的部分结果?

如何使用 fork 来计算计算的部分结果?

交给我的任务是我必须找到所有能整除一个数字(我们称之为x)的数字,并找出它能整除它多少次。
必须使用叉子做任务。
我想到的是,我编写了一个函数来计算一个数字除以 x 的次数,然后我在 for 循环中运行它,它工作得很好。不过我想用 fork 来“并行化”它。是否可以?

我的 C 函数看起来像这样

int check_dividers(int *x, int i)
{
  int c = 0;

  if (*x % i == 0)
  {
    do
    {
      c++;
      *x = *x / i;
    } while (*x % i == 0);
  }

  return c;
}

我尝试生成一个新进程来执行每个计算并将其写入输出文件,但它只是变得混乱。

 int i = 2;

  while (i < x && x != 0)
  {
    if (x % i == 0)
    {
      pid_t pid;

      if ((pid = fork()) < 0)
      {
        perror("error during fork");
        exit(0);
      }
      else
      {
        if (pid == 0)
        {
          int num_dividers = check_dividers(&x, i);

          fprintf(out, "%d: %d\n", i, num_dividers);
          fflush(out);
        }
      }
    }
    i++;
  }

如果 x = 315,我的输出

3: 2
5: 1
7: 1
21: 1
9: 1
5: 1
15: 1
9: 1
7: 1
63: 1
7: 1
105: 1
15: 1
9: 1
35: 1
45: 1
21: 1

答案1

发生的情况是子进程在任务完成后不会退出。所有进程都将运行自己的外循环实例。

你需要exit(0)冲洗一下。

你也应该wait为了孩子。
您可以在 (1) 最后使用while (wait(NULL) != -1);或 (2) 在每个过程之后使用waitpid(pid, NULL, 0);after if ((pid = fork()) < 0) { ... } else { ... }
You'll need include 来执行此操作<sys/wait.h>

第一个选项会暂时导致大量僵尸,但第二个选项会消除并行性。

相关内容