- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
早上好,
我正在尝试学习如何使用 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/
我是一名优秀的程序员,十分优秀!