1

私はピーターソンのアルゴリズム (2 つのプロセスの相互排除) を見ています。私の質問は、プロセスがまだクリティカル セクションに入っておらず、P0 が初めてクリティカル セクションに入る場合、P1 のフラグは false になるので、P0 はどのようにクリティカルセクションに入りますか?P0 がクリティカル セクションに入る条件は、P1 が true になるフラグに依存します。

コード:

    //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
    ...
    // end of critical section
    flag[0] = false;

P1: flag[1] = true;
    turn = 0;
    while (flag[0] == true && turn == 0)
    {
        // busy wait
    }
    // critical section
    ...
    // end of critical section
    flag[1] = false;
4

1 に答える 1

3

P0 がクリティカル セクションに入る条件は、P1 が true になるフラグに依存します。

いいえ、そうではありません。声明は...

while (flag[1] == true && turn == 1) { ... }

P1 のフラグが真でなくなるのを待ってビジーです。つまり、P0 は、P1 がクリティカル セクションを離れるのを待ちます。P1 はまだクリティカル セクションに入っていないため、P0 はビジー ウェイトせず、クリティカル セクションに正しく入ります。

于 2013-03-03T16:48:01.260 に答える