私は次のようなforループを持っています
int c = 0 ;
for(int i=0 ; i<100 ; i++)
c++;
ここで、C はグローバル変数です。このコードを 2 つのスレッドで実行する場合、セクションのスレッドをロックしない場合
の最小値と最大値は何ですか?またその方法は?C
c++
私は次のようなforループを持っています
int c = 0 ;
for(int i=0 ; i<100 ; i++)
c++;
ここで、C はグローバル変数です。このコードを 2 つのスレッドで実行する場合、セクションのスレッドをロックしない場合
の最小値と最大値は何ですか?またその方法は?C
c++
インクリメント コードをアセンブリに変換すると、擬似コードは次のようになります。
1-mov ax,mem[c]
2-inc ax
3-mov mem[c],ax
2 つのスレッドがある場合は、次のシナリオを検討してください。
thread 1: line 1
thread 2: line (1-2-3) for 99 times
thread 1: line (2-3)
thread 2: line 1
thread 1: line (1-2-3) for remaining 99 times
thread 2: line (2-3) for the last time
現在、cの値は 2 であるため、最小値は 2 です
最小値は c + 100 です。最大値は c + 200 です。
スレッドが互いに隣り合って実行される場合、他のスレッドによって更新される前に、同時に c の同じ値を取ることがあります。この場合、両方とも c を同じ値に更新します。
これが最悪のシナリオ (関数をループする回数) で発生した場合、値はその回数だけ更新されます。
これが起こらない場合 (あなたの最良のシナリオ)、たとえば、スレッドが同時に実行されなかった場合、値は必要な回数だけ更新されます。
私の答えは、最小 1、最大 200 です。
きぼうが言ったように、増分コードは次のようになります:
1-mov ax,mem[c]
2-inc ax
3-mov mem[c],ax
for(int i=0 ; i<3 ; i++) で例を実行しましょう
T1 ライン 1 |==> ax = 0; mem[c]=0;
T1 ライン 2 |==> ax = 1; mem[c]=0;
T2 ライン 1 |==> ax = 0; mem[c]=0;
T1 ライン 3 |==> ax = 0; mem[c]=0;
T2 ライン 2 |==> ax = 1; mem[c]=0;
T1 ライン 1 |==> ax = 0; mem[c]=0;
T2 ライン 3 |==> ax = 0; mem[c]=0;
T1 ライン 2 |==> ax = 1; mem[c]=0;
T2 ライン 1 |==> ax = 0; mem[c]=0;
T1 ライン 3 |==> ax = 0; mem[c]=0;
T2 ライン 2 |==> ax = 1; mem[c]=0;
T1 ライン 1 |==> ax = 0; mem[c]=0;
T2 ライン 3 |==> ax = 0; mem[c]=0;
T1 ライン 2 |==> ax = 1; mem[c]=0;
T2 ライン 1 |==> ax = 0; mem[c]=0;
T1 ライン 3 |==> ax = 0; mem[c]=0;
T2 ライン 2 |==> ax = 1; mem[c]=0;
T2 行 3 |==> ax = 1; mem[c]=1;
i=200も同様
c=0
最初に仮定する
マックスだろう200
c++
これは、各スレッドが相互に実行された後、1 回の反復で実行された場合に発生します。
ミンは100
それはc++
基本的に次のとおりです。
temp = c + 1 //line1
c = temp //line2
最初のスレッドが line1 を実行し、次に 2 番目のスレッドがその繰り返しで行. The same value will be set.
So
c will only increase by
1` を実行すると仮定します。
Java では、スレッドセーフにするために: as を宣言c
しAtomicInteger
、それc.addAndGet()
をインクリメントします。