Peterson算法是一个实现互斥锁的并发程序设计算法,核心就是三个标志位是怎样控制两个方法对临界区的访问,这个算法设计的想当精妙,我刚开始看的时候就被绕了一下。
算法使用两个控制变量flag与turn. 其中flag[n]的值为真,表示ID号为n的进程希望进入该临界区. 标量turn保存有权访问共享资源的进程的ID号.
//flag[] is boolean array; and turn is an integer flag[0] = false; flag[1] = false; turn; | |
P0: flag[0] = true; turn = 1; while (flag[1] == true && turn == 1) { // busy wait } // critical section flag[0] = false; // end of critical section |
P1: flag[1] = true; turn = 0; while (flag[0] == true && turn == 0) { // busy wait } // critical section flag[1] = false; // end of critical section |
注意到如果进程P0和P1并发,那么两者中必然会有一个会被while堵塞住(因为flag[0和1]均等于true),而另一个会完成自己的任务并置对方的flag位为false,这时while的条件不再满足,即可执行自己的程序,实现了互斥。