Peterson算法疑问:单进程仅用一次临界区时P1是否陷入死循环?
Peterson算法相关问题解答
flag[0] = 0; flag[1] = 0; turn; P0: flag[0] = 1; turn = 1; while (flag[1] == 1 && turn == 1) { // busy wait } // critical section ... // end of critical section flag[0] = 0; P1: flag[1] = 1; turn = 0; while (flag[0] == 1 && turn == 0) { // busy wait } // critical section ... // end of critical section flag[1] = 0;
问题1:P1是否会陷入while循环无法退出?
不会。P1的while循环采用逻辑与的判断条件,只要其中一个子条件不成立,循环就会终止:
- P0执行完临界区后已将
flag[0]设为0,此时flag[0] == 1为假; - 无论
turn是否为0,flag[0] == 1 && turn == 0整体条件都不成立,循环直接退出,P1可以正常进入临界区。
问题2:当其中一个进程仅希望使用一次临界区时,Peterson算法会出现什么问题?
分两种核心场景讨论:
正常执行完一次后退出:
若进程(如P0)正常执行完临界区,按代码逻辑将flag[0]设为0后彻底终止,另一个进程(P1)后续每次请求临界区时,flag[0]始终为0,while循环条件不成立,可直接进入临界区,不会出现功能异常。但Peterson算法本身的忙等待特性依然存在——即使没有竞争,P1每次进入前仍会执行循环检查,浪费CPU资源(这是所有忙等待同步算法的共性缺陷)。异常终止(未重置flag):
若进程(如P0)在进入临界区前、或临界区执行过程中异常终止,未将flag[0]重置为0,另一个进程(P1)会因flag[0] == 1始终为真,且若turn恰好等于P1的标识(0),则会永久卡在while循环中,无法进入临界区,出现死锁。
内容的提问来源于stack exchange,提问作者CedricJ
相关产品推荐
相关产品推荐

