是否有可能更改Peterson的2进程算法,以便其无争用复杂性(当进程独立运行时其复杂性)将只有三次访问? 在原始版本中,它有4次访问。
彼得森的算法:initialization:
bool flag[0] = {false};
bool flag[1] = {false};
int turn;
P0:
flag[0] = true;
P0_gate: turn = 1;
while (flag[1] == true && turn == 1)
{
// busy wait
}
// critical section
...
// end of critical section
flag[0] = false;
P1:
flag[1] = true;
P1_gate: turn = 0;
while (flag[0] == true && turn == 0)
{
// busy wait
}
// critical section
...
// end of critical section
flag[1] = false;
答案 0 :(得分:0)
我不知道您该怎么做-无法消除flag[i]
的升高和降低,因为那是您“对关键部分至关重要的关键部分”,因此您可以只玩测试。
如果您取消了flag[j]
测试,则将在无争用的情况下使自己陷入僵局,并且如果您取消了turn
测试(和turn
寄存器,因为它现在也没有用了)您将在竞争中陷入僵局。
如果您对flag[j]
的读取和turn
的写入进行重新排序,那么在无争用的情况下,您可能会获得三种访问权限,但是在争用下,如果{{1} }在测试了他们的标志后退出了他们的关键部分,或者至少等到j
返回要求关键部分为止,这将为您提供完全序列化的处理:锁定和未锁定的代码都将被序列化。
QED
(对不起,但这听起来确实像是CS课程的问题)。
BTW:原始算法假定您可以并行读取j
和flag[j]
以提高性能(假设原子访问很慢,但可以跨寄存器并行化),但是您不能利用它布尔布尔评估的结果,因此在两种情况下您实际上都有5个访问权限。