【问题标题】:will this parallel stream work?这个并行流会起作用吗?
【发布时间】:2012-01-28 19:55:17
【问题描述】:

我正在尝试将并行处理组件添加到单线程单进程程序中。我只是在学习一些多处理方法,因此并不能完全确定它们的能力。

我要实现的程序逻辑:

  • 主进程调用一个函数。
    • 在 for 循环开始时调用了函数 fork()。
      • child 继续执行功能工作,要么执行其他子功能,要么根据时间检查退出。
    • 同时,父级首先结束 for 循环,然后重新开始,从而重新分叉第二个子级。
  • 在执行了大约 10 次 fork() 之后,函数会一直持续到 for 循环结束。
  • 一旦完成,函数会根据更高级别的计时器再次调用。

这个实现会起作用吗?示例代码:

check_timer() {
   for(i = 0; i < 10; i++) {
      pid_t pid = fork();
      if(pid == 0) {
         execute child 1 checks and possible executes..
         exit(); // when completed
      }
      else {
         parent maybe does something or just ends first round of for loop..
      }
   }
some implementation of wait(); to wait for all children to finish before leaving check_timer() function..
}

这是否会一次创建多达 10 个子进程在父进程的后台执行,然后等待子进程完成?还有一些关于如何使用 wait() 的提示也会有所帮助。

【问题讨论】:

    标签: c parallel-processing fork wait


    【解决方案1】:

    是的,您最终将总共有 11 个进程。

    您可能希望调用 waitpid 函数,直到没有更多子代(返回 ECHILD)。

    编辑:刚刚注意到您需要pid_t pid = fork();,而不是pid = pid();

    【讨论】:

    • 是否有需要传递给waitpid()的特定参数;还是只知道伺候父母的孩子?另外,pid 检查是否总是只需要检查 0 值?并且父母总是会正确地执行 else 吗?
    • @jake man 2 waitpid-1pid 参数表示“等待任何子进程”。你不能等待不属于你自己的孩子,所以这不是问题。是的,父级将始终为fork() 返回一个非零值。
    • 所以看起来没有等待所有子进程,对吧?我可以实现一个循环计数器来等待任何孩子但等到所有 10 个孩子都完成了吗?我真的只需要确保所有孩子都已返回,因为任何打开的孩子都可能在下一次迭代中导致访问问题。
    • 正如我在帖子中所说,循环直到您得到-1 的返回和ECHILD 的错误状态。
    • 所以我必须循环执行waitpid(-1, &amp;status, 0);并比较&amp;status直到找到ECHILD然后我可以exit();整个函数?
    猜你喜欢
    • 2011-05-21
    • 2011-12-04
    • 2015-01-28
    • 1970-01-01
    • 2019-09-06
    • 2010-11-05
    • 2011-03-30
    • 2023-03-30
    • 1970-01-01
    相关资源
    最近更新 更多