阅读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
。)