不了解此Critical Section解算算法的缺陷

时间:2013-08-27 19:14:25

标签: multithreading algorithm concurrency operating-system

阅读http://www.ics.uci.edu/~bic/courses/JaverOS/ch2.pdf和第20页,有:

  

如果我们坚持让p1p2交替进入他们的关键部分>这个问题很容易解决;一个常见变量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,依此类推。 不幸的是,如果program1program2长得多,或p1暂停program1,则此解决方案难以令人满意。一个远离其关键部分的过程可以防止另一个进入其关键部分,从而违反上述要求1

我用粗体添加的部分对我来说似乎是假的。由于program1在关键部分之后执行,并且在turn设置为2之后,无论p2何时停止其等待循环并进入其关键部分,都无法执行program1 1}}。看起来对我来说是一个非常好的解决方案。

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

(注意:p1是主题,program1p1的非关键部分。)

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

假设program2需要很长时间才能执行program1非常快。确实turn在执行之前将设置为1,允许CS1program1执行。但是,这会将turn设置回2,并且会在program2完成之前卡在那里,正如我所提到的,这将花费很长时间。在program1完成之前,program2无法再次执行。

通过这种方式,program1几乎不会尽可能频繁地执行,因为它总是等待program2完成。