8

私は次のようなforループを持っています
int c = 0 ;
for(int i=0 ; i<100 ; i++)
c++;

ここで、C はグローバル変数です。このコードを 2 つのスレッドで実行する場合、セクションのスレッドをロックしない場合
の最小値と最大値は何ですか?またその方法は?Cc++

4

5 に答える 5

19

インクリメント コードをアセンブリに変換すると、擬似コードは次のようになります。

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 です

于 2013-07-18T21:39:18.310 に答える
0

最小値は c + 100 です。最大値は c + 200 です。

スレッドが互いに隣り合って実行される場合、他のスレッドによって更新される前に、同時に c の同じ値を取ることがあります。この場合、両方とも c を同じ値に更新します。

これが最悪のシナリオ (関数をループする回数) で発生した場合、値はその回数だけ更新されます。

これが起こらない場合 (あなたの最良のシナリオ)、たとえば、スレッドが同時に実行されなかった場合、値は必要な回数だけ更新されます。

于 2013-04-17T09:44:31.630 に答える
0

私の答えは、最小 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も同様

于 2018-03-05T14:25:09.167 に答える
0

c=0最初に仮定する

マックスだろう200

c++これは、各スレッドが相互に実行された後、1 回の反復で実行された場合に発生します。

ミンは100

それはc++基本的に次のとおりです。

temp = c + 1 //line1
c = temp //line2

最初のスレッドが line1 を実行し、次に 2 番目のスレッドがその繰り返しで行. The same value will be set. Soc will only increase by1` を実行すると仮定します。

Java では、スレッドセーフにするために: as を宣言cAtomicInteger、それc.addAndGet()をインクリメントします。

于 2013-04-17T09:43:31.993 に答える