2016-03-22 7 views
0
int x = 0 // global shared variable 
T1: for (i=0; i++; i<100) x++; 
T2: x++ // no loop, just one increment 

T1とT2は別々のスレッドです。私は、xの最終的な価値は1と101の値から何でもよいと言われています。これはどのように可能ですか?私はこれがおそらくちょうど1になる可能性があるのだろうと思っています。いくつかのスレッドが決して実行されない可能性はありますか?

明らかに、何かが実行シーケンスで失敗しますが、私は何を疑問に思っています。 (少なくともほとんどの言語で)

+0

どのような言語ですか? –

+0

任意の言語を想定する –

答えて

6

x++ is not atomic operation、この操作は、実際にこのように動作します:

tmp = x; 
tmp = tmp + 1; 
x = tmp; 

は現在、次の実行順序を前提としています

T2: tmp = x; // tmp is 0 
T1: run all loop iterations, finally x is 100 
T2: tmp = tmp+1; x = tmp; // x is 1 

他の番号を取得するには、次の順序を想像してみてください。

T1: started loop, at some point x is 45 
T2: tmp = x; // tmp is 45 
T1: finished loop, x is 100 
T2: tmp = tmp+1; x = tmp; // x is 46 
+0

ありがとう!だから、どうやって46で終わることが可能ですか? –

+0

@RyanShocker私は46 –

+0

の例で答えを更新しましたありがとう、それをありがとう! –

0

この動作の理由メモリキャッシュです。 スレッドが可能である独立したCPUの以下の状況で実行することができるので:

T1:ロードx値
T2:ロードx値
T1:実行ループ10回(T1_x = 10)
T2:インクリメント(T2_x = 1)
T1:メモリに値10を保存し
T2:あなたは、スレッドの同期を必要とする理由です

メモリに値1が保存されます。詳細はこちらをご覧ください:Mutex example/tutorial?

ありがとうございました。

+0

メモリキャッシングとは何ですか? –

+0

CPUには、キャッシュと呼ばれる非常に高速なメモリが内蔵されています。最新のCPUにはそれぞれPCが搭載されています。 [IntelのWebページ](http://ark.intel.com/products/family/75023/4th-Generation-Intel-Core-i7-Processors#@All)を例に取ってください。あなたはここで詳細を見つけることができますhttps://en.wikipedia.org/wiki/CPU_cache –

+0

あなたが言いたいこと - それはキャッシュのないCPUのために - 私たちは1を得ることができませんか? –

関連する問題