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;
/*其余部分*/
}
}