1

阅读http://www.ics.uci.edu/~bic/courses/JaverOS/ch2.pdf并在第 20 页上是这样的:

p1如果我们坚持这一点并p2交替进入它们的关键部分,问题就很容易解决;一个常见的变量 turn 可以跟踪轮到谁了。这个想法 > 在我们下面的第一个算法中实现。

/* CS Algorithm: Try #1 */
int turn = 1;
cobegin
p1: while (1)
{
  while (turn==2) ; /*wait loop*/
  CS1; turn = 2; program1;
 }
//
p2: while (1)
{
  while (turn==1) ; /*wait loop*/
  CS2; turn = 1; program2;
 }
coend

最初,turn设置为 1,允许p1进入其 CS。退出后,进程设置turn为 2,现在允许p2进入其 CS,依此类推。不幸的是,如果program1比 长得多program2或者如果p1在 中停止program1,这个解决方案将很难令人满意。一个远离其临界区的进程可以阻止另一个进程进入其临界区,因此违反了上述要求 1

我加粗的部分对我来说似乎是错误的。由于program1在临界区之后执行且 afterturn设置为 2,因此p2无论在program1. 对我来说,这似乎是一个完美的解决方案。

我对吗?我没有看到什么吗?

(注意:p1是线程,program1是 的非关键部分p1。)

4

2 回答 2

1

您需要考虑每个代码片段中的 while(1) 循环。正如所写,它需要两个关键部分交替执行。

如果每个外部循环的总时间大致相同,那可能不是什么大问题。如果存在严重的不平衡,例如程序 1 比程序 2 花费的时间长得多,那么 p2 仍将被限制为以 p1 的速度运行。

于 2013-08-27T19:19:35.477 回答
0

假设program2执行时间很长,而program1速度非常快。确实turn1在它执行之前设置,允许CS1program1执行。但是,这将设置turn2,并且会卡在那里直到program2完成,正如我所提到的,这将需要很长时间。program1在完成之前无法再次执行program2

这样,program1就不会尽可能频繁地执行,因为它总是在等待program2完成。

于 2013-08-27T19:21:23.670 回答