阅读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
在关键部分之后执行,并且在turn
设置为2之后,无论p2
何时停止其等待循环并进入其关键部分,都无法执行program1
1}}。看起来对我来说是一个非常好的解决方案。
我是对的吗?我没有看到什么吗?
(注意:p1
是主题,program1
是p1
的非关键部分。)
答案 0 :(得分:1)
您需要考虑每个代码片段中的while(1)循环。如上所述,它需要交替执行两个关键部分。
如果每个外环的总时间大致相同,那可能不是什么大问题。如果存在严重的不平衡,例如program1比程序2花费的时间长了很多,那么p2仍将仅限于以p1的速度运行。
答案 1 :(得分:0)
假设program2
需要很长时间才能执行program1
非常快。确实turn
在执行之前将设置为1
,允许CS1
和program1
执行。但是,这会将turn
设置回2
,并且会在program2
完成之前卡在那里,正如我所提到的,这将花费很长时间。在program1
完成之前,program2
无法再次执行。
通过这种方式,program1
几乎不会尽可能频繁地执行,因为它总是等待program2
完成。