2

共有変数 x を持つ 2 つの異なるプロセスがある場合、両方のプロセスが完了したときの x の可能な値は何ですか?

プロセス A は次の for ループを実行しています。

for (i = 0; i < 5; i++)
    x++

プロセス B が実行されています。

for (j = 0; j < 5; j++)
    x--

x が 0 に初期化されていると仮定すると、x は -5 から 5 のどこにでもあると言いたいのですが、これは本当ですか? 説明を含めてください。

4

2 に答える 2

1

x++コンパイラーがインクリメントまたはデクリメントする単一の命令を生成すると仮定すると、x--両方のスレッドが完了した後、for ループが実行される前と同じ値 (0) になります。

それ以外の場合は、次の例を見てみましょう。

x++:
1. MOV R1, x     //register R1 receives x
2. INC R1        //register R1 is incremented
3. MOV x, R1     //store decremented x back to the memory

x--:
1. MOV R1, x     //register R1 receives x
2. DEC R1        //register R1 is decremented
3. MOV x, R1     //store decremented x back to the memory

行 1 の実行後に 1 つのスレッドが CPU を失うと、値が更新されず、競合状態が発生し、変数が -5 と +5 の間の値を持つことは明らかです。あなたが指摘したように、両方のスレッドが持つことができる実行の異なる順序に応じて、スレッドは実行されます。

于 2013-10-08T17:24:45.267 に答える