Concurrency 在互斥解决方案中测试和设置

Concurrency 在互斥解决方案中测试和设置,concurrency,operating-system,mutual-exclusion,Concurrency,Operating System,Mutual Exclusion,我正在检查互斥解决方案的正确性,需要检查互斥性、活跃性和公平性是否都得到满足。L1和L2是任意代码行。有两个进程同时运行。下面是流程i的代码,流程j的代码是对称的 bool waiting[i] = false; bool waiting[j] = false; bool busy = false; cobegin(process i) L1: Si(1) L2: Si(2) waiting[i] = true; L3: while (waiting[i] and TST(busy)

我正在检查互斥解决方案的正确性,需要检查互斥性、活跃性和公平性是否都得到满足。L1和L2是任意代码行。有两个进程同时运行。下面是流程i的代码,流程j的代码是对称的

bool waiting[i] = false;
bool waiting[j] = false;
bool busy = false;

cobegin(process i)

L1: Si(1)
L2: Si(2)
    waiting[i] = true;
L3: while (waiting[i] and TST(busy));
L4: [ Critical Section ]
L5: waiting[i] = false;
L6: busy = false;
L7: while(waiting[j];
L8: Go to L2

我知道这三家酒店都很满意,但我只需要确保我没有错过任何东西。您能找到一个不满意的属性吗?

在第L3行,
waiting[i]
将始终为true,因为您刚刚在前一行中将其更改为true。我认为
TST
是不可分割的
test\u和\u set
指令的硬件实现。在这种情况下,您可以使用
while(TST(busy))并且解决方案是正确的。
waiting
标志似乎没有任何作用。

这看起来类似于。事实上,你可以。这很聪明,谢谢!乍一看,甚至我都认为它与Peterson的算法很接近,但随后,我注意到它只是一个基于硬件的解决方案,完全依赖于test_和_集。您关于TST的假设是正确的。看来我们的结果是一致的,死锁、活锁或违反互斥和公平是不可能的。你的结论是正确的。我要改变的唯一一件事就是不再等待来简化代码。实际上,等待标志似乎确保了公平性。如果没有它们,其中一个ps就可以继续循环,而另一个ps在错误的时间测试锁,如果这是真的。我不知道等待标志如何确保公平性。正如代码所示,waitingwaiti变为true,其他等待的检查在exit部分。为了确保满足有界等待条件,您需要一种使用逻辑计数器的切换机制。