C++ Don';我不同意彼得森的观点;s溶液

C++ Don';我不同意彼得森的观点;s溶液,c++,operating-system,critical-section,C++,Operating System,Critical Section,如果在进程0执行该语句后发生时钟中断,是否违反了关键区域的第三个标准 #define FALSE 0 #define TRUE 1 #define N 2 int turn; int interested[N]; void enter_region(int process) { int other; other = 1 - process; interested[process] == TRUE; turn = process; // set flag while (tu

如果在进程0执行该语句后发生时钟中断,是否违反了关键区域的第三个标准

#define FALSE 0
#define TRUE 1
#define N 2

int turn;
int interested[N];

void enter_region(int process) {
  int other;
  other = 1 - process;
  interested[process] == TRUE;
  turn = process; // set flag
  while (turn == process && interested[other] == TRUE)
}
void leave_region(int process) { interested[process] = FALSE; }
因为进程1会在其整个处理器时间内等待while循环,而处理器0会阻止进程1


Perterson的解决方案或algoruthm是一种著名的互斥并行编程算法,它允许两个进程共享一个单一使用的资源而不发生冲突,只使用共享内存进行通信


我所指的标准是:在关键区域之外运行的任何进程都不能阻止任何进程。

要进入关键区域的进程必须被尚未完全释放的进程阻止。这就是互斥算法的明确目的

第三个标准是,在临界段之外运行的任何进程都不会阻塞其他进程。流程一不会阻止其他流程,它只能被尚未发布关键部分的流程阻止。因此,第三个标准没有被违反


如果您仍然不同意,请解释process one是如何阻止其他进程的,或者process one是如何被运行在其关键部分之外的进程阻止的。

您应该再添加一点上下文我们不知道Peterson试图解决的问题,或者我们从未见过的列表中的第三个标准是什么。抱歉,Perterson的解决方案或algoruthm是一种著名的互斥并行编程算法,它允许两个进程共享一个单一使用的资源而不发生冲突,只使用共享内存进行通信。我一直在寻找一个熟悉这个问题的人的答案,因为我在我的操作系统教科书中寻找了一个关于这个问题的答案,但我没有找到答案。我所指的标准是:在关键区域之外运行的任何进程都不会阻止任何进程。为什么您关心回答您问题的人是否熟悉该问题?对于所有不熟悉问题的人来说,这也是一种粗鲁,他们读了你的问题,只是感到困惑。(我能够通过搜索引擎找到上下文,但为什么要让人们经历这些呢?如果这是一个如此著名的问题,应该很容易找到它的链接,不是吗?)任何关于这个问题的相关信息都应该添加到问题中,而不是在评论中。我已经对你的问题进行了编辑,在问题的末尾添加了你的评论。如果您希望重新格式化,您可以自己重新格式化考虑以下示例:进程0调用enter_region例程,它本身不是临界区域的一部分。执行语句后,感兴趣的[process]=TRUE;时钟中断ocurs和调度程序将CPU“提供”给进程1。进程1还调用enter_region,它将感兴趣的[1]设置为TRUE,并将其设置为1。当它到达Loop turn=1时,感兴趣的[0]=1,因此进程1将被拒绝访问关键区域,即使进程0不在其关键区域。进程0也将被拒绝访问。进程1将在第三轮进入关键区域。如果保证某个线程是下一个从
enter_region
返回的线程,则该线程已进入关键区域,因为它已阻止任何其他线程在其前面获取该区域。如果您认为线程一旦设置了代码> >兴趣(1)到<代码> Trase,就进入了关键区域,没有问题。这种情况与线程在返回
enter_region
时停止运行的情况相同,这是任何算法都无法避免的(也不需要避免)。enter_region不是关键区域的一部分,或者我错了?关键区域是程序进入_区域后的代码块,我不是说进程1会任意进入第三轮CR,但在这个例子中,遵循算法,这就是将要发生的事情。如果过程enter_region是不可分割的,这意味着它不能被中断,就像信号量中的操作一样,就不会有任何问题,但我在任何地方都没有发现这种情况。这就是我首先问这个问题的原因。如果这是真的,你就不会在关键区域,因为
enter\u region
returns不可能是正确的。
enter_region
的目的是让您在关键区域外调用它,并让它返回关键区域内。在该函数内部的某个地方,会发生转换。sempahores也是如此。如果内核决定在acquire操作完成时但在返回调用方之前正确切换线程,该怎么办?我不理解你的意思,你是说enter_区域是CR区域的一部分还是不是?CR是处理共享内存的代码的一部分。也就是说,enter_region过程中没有共享内存,因此enter_region不是临界区域的一部分。我不是在说这个。这来自我的课本
interested[process]==TRUE;