gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:11:41 25 4
gpt4 key购买 nike

早上好,

我正在尝试学习如何使用 Peterson 的解决方案来保护关键部分。每个进程都试图将总计增加到 100,000,并且我必须确保每个子进程都调用 process#()。我还需要使用“等待”功能,以便 parent 知道 child 何时完成。一旦 child 完成,我需要打印进程 ID 和进程 1 中断进程 2 的次数,反之亦然。尽管我已经阅读了很多书,但我真的不知道自己在做什么。我应该使用什么“等待”功能?我该如何使用它?为什么我的代码增加到 200,000 而不是 100,000?

Code removed, unnecessary for question.

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

最佳答案

wait()您所指的命令(和 waitpid() )是您在父进程中使用的命令,用于“等待”子进程终止(阻塞,意味着父进程在子进程更改状态之前不会继续执行)。如果您的 child 终止而您没有wait()在父进程中,子进程将成为“僵尸”。 wait()有效地“收获”子进程。

这是 waitpid() 的签名:

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

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

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

以防万一您不知道,您可以根据fork()的返回值来判断您是父级还是子级。 ,但我想你已经知道这一点了。所以在 if 的体内(检查父级)是您执行 wait() 的地方。

另外,是process2()应该有while (k < 200000) ?这就是你说它会增加到 200,000 的原因吗?

关于c - 彼得森的等待解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35520810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com