3

競合状態のシナリオについて質問があります。質問:

次の 2 つのスレッドを共有メモリで同時に実行することを検討してください (すべての変数は 2 つのスレッド間で共有されます)。

Thread A 
for i = 1 to 5 do 
  x = x + 1;

Thread B 
for j = 1 to 5 do
  x = x + 1;

シングル プロセッサ システムで、ロードとストアがアトミックであり、x が 0 に初期化され、x がインクリメントされる前にレジスタにロードされる (そして後でメモリに格納される) 必要があると仮定すると、x のすべての可能な値は何ですか?両方のスレッドが完了した後?

答えは 2:10 です。5:10 の結果はわかりましたが、どうして x が 2、3、または 4 になるのでしょうか?

4

1 に答える 1

4

x = 2 を取得するシーケンス:

Thread 2 read // Reg_2 = 0
Thread 1 read/write 4 times // x = 4
Thread 2 write // * Reg_2 = 0 --> x = 1
Thread 1 read // Reg_1 = 1
Thread 2 read/write 4 times // x = 5
Thread 1 write // Reg_1 = 1 --> x = 2

* でマークされたステップでプリエンプトする前にスレッド 2 が実行する書き込み回数に応じて、3 と 4 の結果が得られます。

于 2012-06-19T02:23:21.950 に答える