请看一下下面的伪代码:
boolean blocked[2];
int turn;
void P(int id) {
while(true) {
blocked[id] = true;
while(turn != id) {
while(blocked[1-id])
/* do nothing */;
turn = id;
}
/* critical section */
blocked[id] = false;
/* remainder */
}
}
void main() {
blocked[0] = false;
blocked[1] = false;
turn = 0;
parbegin(P(0), P(1)); //RUN P0 and P1 parallel
}
我认为可以使用上面的代码实现一个简单的互斥解决方案。但这不起作用。有谁知道为什么吗?
任何帮助将不胜感激!
由于以下原因,本示例中不能保证互斥:
我们从以下情况开始:
blocked = {false, false};
turn = 0;
P1 现在执行,并跳过
blocked[id] = false; // Not yet executed.
现在的情况是:
blocked {false, true}
turn = 0;
现在P0执行。它通过了第二个 while 循环,准备执行关键部分。而当P1执行时,将turn设置为1,也准备好执行临界区。
顺便说一句,这种方法最初是由海曼发明的。 1966 年,他将其发送给 ACM Communications
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)