c语言 - 彼得森的等待解决方案



早上好,

我正在尝试学习如何使用彼得森的关键部分保护解决方案。每个进程都试图将总数增加到 100,000,我必须确保每个孩子都调用 process#()。我还需要使用"等待"功能,以便父母知道孩子何时完成。孩子完成后,我需要打印进程 ID 和进程 1 中断进程 2 的次数,反之亦然。我真的不知道我在做什么,即使我已经阅读了很多。我应该使用的"等待"功能是什么?如何使用它?为什么我的代码递增到 200,000 而不是 100,000?

Code removed, unnecessary for question.

显然在主函数的某个地方,我需要循环让父级等待子项,然后打印子项的进程 ID,但我不知道该怎么做。

您引用的wait()命令(和waitpid())是您在父进程中用于"等待"子进程终止的命令(阻塞,意味着父进程在子进程更改状态之前不会继续执行)。如果您的孩子终止并且您不wait()父进程,则子进程将成为"僵尸"。 wait()有效地"收获"子进程。

这是waitpid()的签名:

pid_t waitpid(pid_t pid, int *status, int options);

status是一个变量,可用于将一些信息从子项返回给父项(例如,此过程被中断的次数(假设您在子进程中跟踪此过程?)));它是子项的退出代码。假设您有一个 PID 为 1234 的孩子,您会调用waitpid(1234, &status 0)(如果您想等待非阻塞,则必须使用 WNOHANG 作为选项(如果没有孩子退出,它会立即返回)。查看 http://linux.die.net/man/2/waitpid,因为您可以为waitpid()使用很酷的值,例如等待任何孩子退出-1(这与常规wait()相同)。如果您还有其他问题,请发表评论,但希望这足以为您指明正确的方向:)。

由于您想在父级中"循环"以等待您的孩子,因此您可以完全跳过循环并使用正常的"阻塞"等待,或者您可以使用具有非阻塞等待的无限循环(或一系列循环,如果您不使用常规wait(),则每个孩子一个)。

以防万一您不知道,您可以根据 fork() 的返回值确定您是在父级还是子级中,但我想您已经知道这一点。因此,在if的正文(检查父级)中,您将执行wait()

另外,process2()应该有while (k < 200000)吗?难道你说它增加到200,000吗?

相关内容

最新更新