Petersonアルゴリズムの悟り


Petersonアルゴリズムは、相互反発ロックを実現する同時プログラム設計アルゴリズムであり、核心は三つのマークビットがどのように二つの方法の臨界エリアへの訪問を制御するかということであり、このアルゴリズムの設計は素晴らしいと思います.
アルゴリズムは2つの制御変数flagsとturnを使用しています.flags[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
プロセスP 0とP 1を併発すると、両者の中には必ずwhileに塞がれます(flags[0と1]はtrueに等しいので)、もう一つは自分の任務を遂行して相手のflags位をfalseとします.この時、whileの条件が満たされなくなり、自分のプログラムを実行して、相互反発を実現できます.