0

これらの2つのスレッドは共有メモリで同時に実行されます(すべての変数は2つのスレッド間で共有されます):
スレッドA

for (i=0; i<5; i++) {
  x = x + 1;
}

スレッドB

for (j=0; j<5; j++) {
   x = x + 2;
}

シングルプロセッサシステムを想定します
。a-両方のスレッドが完了したときにx≤15である理由を簡潔に証明します。
b-スレッドBのx=x+2をx=x-1に置き換えたとします。これはXの値になります。

私はこの質問を理解していません、そして私はそれをグーグルで検索しました、そして私は答えを見つけました、しかし私はそれを得ることができません私はそれについていくつかの説明が欲しいです。

4

2 に答える 2

4

スレッド化が完全に機能する場合、「x」の最大値は15です。これはすべてオペレーティングシステムのスケジューラーによって異なります。

xの初期値を0と仮定していることに注意してください。スレッドAとスレッドBがシリアル化されているとしましょう。スレッドAが完了した後のxの値は5になります。

 i | x
-------
 0 | 1
 1 | 2
 2 | 3
 3 | 4
 4 | 5

スレッドBに入るxの値は5になり、結果としてxは15の最終値になります。

 i | x
-------
 0 | 7
 1 | 9
 2 | 11
 3 | 13
 4 | 15

現在、この方法では通常、事態は発生せず、スレッドはxの初期値を読み取り、それらを加算してから、変更された値をメモリに書き戻します。次のことが発生する可能性があります。

Thread A reads the value 'x' as 0
Thread B reads the value 'x' as 0
Thread A adds 1 to x making its local copy of x, 1
Thread B adds 2 to x making its local copy of x, 2
Thread A writes its modified value of x as 1
Thread B writes its modified value of x as 2 (overwriting Thread A's modification)

したがって、xは15以下になりますが、スケジューラーによってはそれより少なくなります。

于 2012-11-12T17:27:20.240 に答える
2

a) 命令x=x+1は低レベルの単一命令ではなく、読み取りxのシーケンスで構成され、xに1を追加してから、xのメモリを更新します。したがって、2つのスレッドが同じ値のxを読み取る可能性があります。

2つのスレッドがx変数の同じ値を読み取った場合、xを更新し、xに書き戻すと、x<15になります。

b) 同じ理由で、命令が。の場合、xの値は0から5の間になる可能性がありますx=x-1


これを試してみてくださいあなたはもっと学ぶでしょう!
それを使用してcコードをコンパイルする-S optionと、プログラム用にコンパイルされたアセンブルコードが作成されます。その後、できますunderstand x = x + 1 is not a single instruction。また、スレッド間の切り替えは、命令が完了する前に可能であるx = x + 1 ため、アトミックではありません。

于 2012-11-12T17:43:12.300 に答える