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

标签 c linux-kernel wait critical-section

早上好,

我正在尝试学习如何使用 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/

相关文章:

c++ - C 读取文件时出错

lua - Lua-从用户那里获取命令行输入?

swift - 如何在运行序列之前等待一段时间?

linux-kernel - 编译器/链接器如何解析内核 API,例如从 linux 上的模块调用的 'printk'

c++ - 使用 linux 功能读取 block 的不连续运行

java - wait() 和 this.wait() 的区别

c# - 拦截与获取Windows版本相关的API调用

c - 固定大小类型的动态分配

c# - 与 C 和 C++ 相比,为什么 C# 代码需要很长时间才能执行

c - 对象WMA(虚拟内存区域:) and PTE (Page Table Entry)?)之间有什么区别