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