Peterson 算法(Dekker算法的演化)是免锁编程的基本算法之一,这个算法设计得很巧妙,核心就是三个标志位是怎样控制两个方法对临界区的访问的:
- volatile int flag1 = 0; //主观因素:flag1表示方法1自身是否要求进入临界区
- volatile int flag2 = 0; //主观因素:flag2表示方法2自身是否要求进入临界区
- volatile int turn = 1; //客观因素:turn取1和2分别表示当前临界区针对方法1还是方法2开放
- void fun1(){
- flag1 = 1;
- turn = 2;
- while( flag2==1 && turn==2 ){} //只有在方法2自身要求进入临界区且临界区针对方法2开放时,方法1才会阻塞
- //Critical Section
- ... //临界区内
- flag1 = 0;
- }
- void fun2(){
- flag2 = 1;
- turn = 1;
- while( flag1==1 && turn==1 ){} //只有在方法1自身要求进入临界区且临界区针对方法1开放时,方法1才会阻塞
- //Critical Section
- ... //临界区内
- flag2 = 0;
- }