为什么测试不是在进程0的第一个入口严格交替时(转= = 0)//然后输入 如何处理0进入(转!= 0),是否与while相同(转= = 1)?
turn = 0;
//process 0 to enter
while (TRUE) {
while (turn != 0)
critical_region();
turn = 1;
noncritical_region();
}
//process 1 to enter
while (TRUE) {
while (turn != 1)
critical_region();
turn = 0;
noncritical_region();
}
答案 0 :(得分:4)
首先,您的代码有误。 Tanenbaum的严格交替看起来像这样(他的例子写的没有块,但我认为这样做更容易):
while (TRUE) {
while (turn != 0)
{
/* do nothing */
}
critical_region();
turn = 1;
noncritical_region();
}
严格交替的想法有两个方面:
答案 1 :(得分:1)
如果展开使用括号发布的代码,它看起来像这样:
turn = 0;
//process 0 to enter
while (TRUE)
{
while (turn != 0)
{
critical_region();
}
turn = 1;
noncritical_region();
}
因此,当您第一次进入主循环时,它会将turn
设置为1并调用noncritical_region
。它第二次调用critical_region
并且可能会停留在那里。
答案 2 :(得分:1)
我认为代码实际上就像这样
while (TRUE)
{
while (turn != 0) **;**
critical_region;
turn=1;
noncritical_region;
}
请注意,在书中,分号是在内部后面的注释/ * loop * /之后写的。
答案 3 :(得分:0)
我怀疑正确的代码是:
turn = 0;
//process 0 to enter
while (TRUE) {
while (turn != 0) critical_region();
turn = 1;
noncritical_region();
}
//process 1 to enter
while (TRUE) {
while (turn != 1) critical_region();
turn = 0;
noncritical_region();
}