Multithreading Don';我不理解此临界截面求解算法的缺陷

Multithreading Don';我不理解此临界截面求解算法的缺陷,multithreading,algorithm,concurrency,operating-system,Multithreading,Algorithm,Concurrency,Operating System,阅读第20页,内容如下: 如果我们坚持让p1和p2交替进入它们的关键部分,那么问题很容易解决;一个常见的变量turn可以跟踪轮到谁。这个想法在我们下面的第一个算法中得到了实现 最初,turn设置为1,这允许p1输入其CS。退出后,进程将turn设置为2,现在允许p2输入其CS,依此类推不幸的是,如果program1比program2长得多,或者如果p1在program1中暂停,则此解决方案将很难令人满意。一个工艺在其关键部分之外,可防止另一个工艺进入其关键部分,从而违反上述要求1 我用粗体字写的

阅读第20页,内容如下:

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

最初,
turn
设置为1,这允许
p1
输入其CS。退出后,进程将
turn
设置为2,现在允许
p2
输入其CS,依此类推不幸的是,如果
program1
program2
长得多,或者如果
p1
program1
中暂停,则此解决方案将很难令人满意。一个工艺在其关键部分之外,可防止另一个工艺进入其关键部分,从而违反上述要求1

我用粗体字写的部分对我来说似乎是假的。由于
program1
在关键部分之后执行,并且
turn
设置为2之后,因此无论
program1
中发生什么情况,都无法阻止
p2
离开其等待循环并进入其关键部分。对我来说这是个很好的解决方案

我说得对吗?我没看见什么吗


(注释:<代码> P1<代码>是线程,<代码>程序1>代码>是<代码> P1<代码>的非关键部分。

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


如果每个外部循环的总时间大致相同,那么这可能不是什么大问题。如果存在明显的不平衡,例如程序1比程序2长很多,那么P2仍然局限于以P1的速度运行。

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


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

比方说
program2
需要很长时间才能执行,而
program1
速度非常快。确实,
turn
在执行之前将设置为
1
,允许执行
CS1
program1
。但是,这将设置
返回到
2
,并且它将被卡在那里直到
程序2
完成,正如我提到的,这将花费很长时间<代码>程序1
程序2
完成之前无法再次执行


这样一来,
program1
将无法尽可能频繁地执行,因为它总是等待
program2
完成。

比方说
program2
执行时间很长,而
program1
执行速度很快。确实,
turn
在执行之前将设置为
1
,允许执行
CS1
program1
。但是,这将设置
返回到
2
,并且它将被卡在那里直到
程序2
完成,正如我提到的,这将花费很长时间<代码>程序1
程序2
完成之前无法再次执行


通过这种方式,
program1
将无法尽可能频繁地执行,因为它总是等待
program2
完成。

“考虑每个代码片段中的while(1)循环。如前所述,它需要两个关键部分交替执行。”我想我在这里缺少一些基本原理。如果是这样,那么一切都有意义。但为什么会这样呢?我想象的方式是,上下文切换可以在任何时候发生。因此,一旦p1的关键部分完成,就会发生上下文切换p2的等待循环结束,并沿着它的快乐之路前进。@MatthewHolmes假设p1执行CS1,然后开始一个需要3小时的计算。p2执行CS2一次,将回合设置为1。几微秒后,p2完成程序2,并返回其循环的顶部。在接下来的3个小时里,它会卡在“while(turn==1)”位置。turn将保持等于1,直到3小时后p1到达循环的顶部并再次执行CS1。“考虑每个代码片段中的while(1)循环。如前所述,它需要两个关键部分交替执行。”我想我缺少一些基本知识。如果是这样,那么一切都有意义。但为什么会这样呢?我想象的方式是,上下文切换可以在任何时候发生。因此,一旦p1的关键部分完成,就会发生上下文切换p2的等待循环结束,并沿着它的快乐之路前进。@MatthewHolmes假设p1执行CS1,然后开始一个需要3小时的计算。p2执行CS2一次,将回合设置为1。几微秒后,p2完成程序2,并返回其循环的顶部。在接下来的3个小时里,它会卡在“while(turn==1)”位置。回合将保持等于1,直到3小时后p1到达循环的顶部并再次执行CS1。
/* 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