我试图理解Peterson和Dekker的算法,它们非常相似并且显示出很多对称性。
我试图用非正式语言来制定算法,如下所示:
Peterson's: "I want to enter." flag[0]=true;
"You can enter next." turn=1;
"If you want to enter and while(flag[1]==true&&turn==1){
it's your turn I'll wait." }
Else: Enter CS! // CS
"I don't want to enter any more." flag[0]=false;
Dekker's: "I want to enter." flag[0]=true;
"If you want to enter while(flag[1]==true){
and if it's your turn if(turn!=0){
I don't want to enter any more." flag[0]=false;
"If it's your turn while(turn!=0){
I'll wait." }
"I want to enter." flag[0]=true;
}
}
Enter CS! // CS
"You can enter next." turn=1;
"I don't want to enter any more." flag[0]=false;
差异似乎是发生在Dekker的地点"You can enter next."
和发生的事实"if it's your turn I don't want to enter any more."
。
在彼得森的算法中,这两个过程似乎占主导地位。除非轮到对方,否则一个过程似乎迫使他进入了关键部分。
相反,在Dekker的算法中,这两个过程似乎是顺从而礼貌的。如果两个过程都想进入关键部分,而轮到另一个,则该过程决定不再要进入。(饥饿自由需要吗?为什么?)
这些算法到底有何不同?我想象当两个过程都试图进入关键部分时,在Peterson的过程中,过程说“我进入”,而在Dekker的过程中,过程中说“您可以进入”。有人可以弄清楚每种算法中流程的行为方式吗?我用非正式的说法表达的方式正确吗?