理解Peterson算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/winter_wu_1998/article/details/83692875

先上算法代码:

int turn;
int interested[2];

void enter_region(int process)//在进入临界区前调用
{
	int other = 1 - process;
	interested[process] = true;
	turn = process;
	while ( turn == process && interested[other] = true);
}

void leave_region(int process)//在进入临界区后调用
{
	interested[process] = false;
}

我们考虑两个进程P0,P1, 假设P0,P1都想进入临界区(即interested = true)。直接考虑P0马上要处理的代码是最后的while循环,在这之前无所谓P1是否已经在临界区,因为P0还没有进入临界区。

如果turn = 0,则P1应该是只运行到turn行之前(或者更简单P1不想进入临界区),此时如果P1处于interested行前,则P0直接跳出循环进入临界区。这种情况下,P1不可能进入临界区(因为此时interested[0] = true)。如果P1执行了interested行,则P0先循环等待P1执行turn行,然后跳出循环进入临界区(因为此时turn = 1,不满足循环条件)。P0先turn,所以P0先进入临界区,此时满足先到先得原则。

如果turn = 1,则P1此时也马上要运行while循环或者已经在运行了,此时P0直接跳出循环进入临界区。注意此时P1不可能已经在临界区,因为interested[0] = true。那有没有可能P1在interested[0] = false时已经执行到这了呢? 这是可能的,但是显然此时P0并没有进入临界区,不违反互斥原则。

猜你喜欢

转载自blog.csdn.net/winter_wu_1998/article/details/83692875
今日推荐