1
proces P0:                             proces P1:
while (true)                           while (true)
{                                      {
  flag[0] = true;                          flag[1] = true;
  while (flag[1])                          while (flag[0])
  {                                        {
     flag[0] = false;                        flag[1] = false;
     flag[0] = true;                         flag[1] = true;
  }                                        }
 crit0();                                  crit1();
 flag[0] = false;                          flag[1] = false;
 rem0();                                   rem1();
}                                       }

有人可以给我一个带有上下文切换的场景,以证明上述代码是否满足进度和有限等待的要求。

谁能给我一些关于如何检测代码是否满足进度或有限等待要求的提示(可能包括饥饿、死锁和追随你)

4

1 回答 1

2

这两个过程同时发生。

这里的诀窍是,由于没有真正同步这两个程序,所以行之间可能会发生一些事情。同样,事情可能同时发生。

要了解这可能是一个问题,请考虑一下这种情况......

如果第一个 flag[0] = true 和第一个 flag[1] = true 同时发生在 P0/P1 上会发生什么?

进程 1 和进程 2 都会卡在 while 循环中。他们将如何退出 while 循环?一个进程必须在另一个进程将其 flag[me] 设置为 true 的同一时刻检查 while(flag[other])。这是一个非常狭窄的时间跨度。这相当于一遍又一遍地掷骰子,直到你达到一定的数字才会继续。

这就是为什么我们需要更高级别的东西来为我们处理同步 - 真正的锁等。

编辑:哦,另一件事。您可能想检查读/写操作是否是线程安全的。如果系统在尝试读取该位的同时尝试写入该位会发生什么?

编辑2:仅供参考 - http://msdn.microsoft.com/en-us/library/aa645755(v=VS.71).aspx

于 2010-06-16T19:22:37.677 回答