Dekker算法与Peterson算法

Dekker算法与Peterson算法都是用来解决进程/线程互斥问题

Dekker互斥算法是由荷兰数学家Dekker提出的一种解决并发进程互斥与同步的软件实现方法。(百度百科

Peterson算法是一个实现互斥锁的并发程序设计算法,可以控制两个线程访问一个共享的单用户资源而不发生访问冲突。

Gary L. Peterson于1981年提出此算法。(百度百科

Dekker算法思路:

当p0希望进入自己的临界区时,它把自己的flag值设为true

然后继续 检查P1的flag
如果P1的flag为false,P0可以立即进入自己的临界区。
否则 P0检查turn,如果发现turn=0,那么它知道自己该坚持进入,
从而周期性的检查P1的flag,
P1在某一点将注意到应把turn值赋为0,随后把其flag置为false,允许P0进入
在P0结束其临界区后,把自己的flag置为false。释放 其临界区,并把turn值置为1

从而把坚持进入的权利转交给P1。

//Dekker算法
bool flag[2];//提供所有进程的状态
int turn;//表示哪个进程应坚持进入
void p0()
{
	while(true)
	{
		flag[0]=true;//P0想使用临界区
		while(flag[1])//P1也想使用
			if(turn==1)//确实轮到了P1使用
			{
				flag[0]=false;//P0取消请求
				while(turn==1)
					/*什么也不做*/
				flag[0]=true;//P1用完后,P0继续发出请求
			}
			临界区
			flag[0]=false;//p0用完了
			turn=1;//将权限移交给P1
			其余部分
	}
}
void p1()
{
	while(true)
	{
		flag[1]=true;
		while(flag[0])
			if(turn==0)
		{
			flag[1]=false;
			while(turn==0)
				/*什么也不做*/
			flag[1]=true;	
		}
		临界区
		flag[1]=fasle;
		turn=0;
	}
}
void main()
{
	turn=0;
	flag[0]=false;
	flag[1]=false;
	perbegin(p0(),p1());
}

Peterson算法思路:

考虑进程P0,一旦它把flag[0]置为true,P1不能进入其临界区;

如果P1已经在临界区中,则flag[1]=true;且P0被阻止进入临界区。


另一方面,还可以防止相互阻塞

假设P0在它的while循环被阻塞,这意味这flag[1]=true且turn=1

则当flag[1]变为false或者turn变为0时,P0都可以进入自己的临界区


boolean flag[2]={false,true};
int turn;
void p0()
{
	while(true)
	{
		flag[0]=true;
		turn=1;
		while(flag[1]&&turn==1)//1号想使用且拥有使用权
			/*什么也不做*/
        临界区
        flag[0]=false;
        /*其余部分*/
	}
}
void p1()
{
	while(true)
	{
		flag[1]=true;
		turn=0;
		while(flag[0]&&turn==0)
			/*什么也不做*/
		临界区
        flag[1]=false;
        /*其余部分*/	
	}
}

猜你喜欢

转载自blog.csdn.net/jyl1159131237/article/details/80316388
今日推荐