相对于Dekker算法(参见进程互斥(二)Dekker算法),Peterson算法简化了进程互斥的实现。
假设有两个进程需要互斥的访问某一个临界区。
Peterson算法的形式如下:
enterRegion(process);// process表示进程号 // 临界区 leaveRegion(process);
具体实现如下(Java实现):
有两个全局变量:
// 用于表示轮到哪个进程
private int turn;
// 用于表示进程进入临界区的意愿,下标对应进程号
private boolean[] interested = new boolean[] {false, false};
/**
* @param process 进程号
*/
public void enterRegion(int process) {
// 另一个进程的进程号
int other = 1 - process;
// 进程process想进入临界区
interested[process] = true;
// 设置轮到自己进入临界区了
turn = process;
/**
* 当两个进程同时想进入临界区时,它们的interested[process]都
* 为true,但后一个进程设置的turn值会覆盖前一个进程设置的turn值,
* 这样后一个进程的turn == process条件为真,它会在该while循环
* 中持续等待,而前一个进程的turn == process条件为假,能顺利进入
* 临界区;等前一个进程离开临界区后,后一个进程也能进入临界区
*/
while (turn == process && interested[other] == true) {
}
}
public void leaveRegion(int process) {
interested[process] = false;
}原文:http://blog.csdn.net/l294265421/article/details/46674847