2017-07-17 17 views
1

C++プログラマーがここでD. を学習しています。これは、実際のコードで問題が発生していることを示すための非常に簡単な例です。グローバル変数のコードスタイルの問題を完全に認識していますが、なぜこれが機能しないのか理解したいだけです。複数のスレッドからグローバル値を読み取る

スレッドを作成する前にメインプログラムで初期化する「グローバル変数」があります。私はその後、その変数を読み取るいくつかのスレッドを持っています。 決してが設定された後に書かれていますので、設定されていないと同期せずに読み込む競合状態にならないようにしてください。

しかし、動作しません。私は自分のスレッドで値12を見ることはありません、彼らは常に値0を読みます。 私はC++では、あるスレッドで書かれた値が別のスレッドで見えることを保証するためにmutexまたはstd :: atomic変数を使うべきであることを知っています。おそらく同じことがDにも当てはまりますが、私はスポーンの呼び出しがほぼ100%同期している可能性が高いと推測していましたが、私はミューテックスを実験しました。メインスレッドでは12、生成されたスレッドでは0です。

この作業を行うために必要なことはありますか?

どんなに私が得るか何: -

From thread A=0 
From main A=12 

コードをされていない: - Dで

import std.concurrency; 
import std.stdio; 
import core.thread; 

int a; 

void myThread() 
{ 
    writeln("From thread A=", a); 
} 

void main() 
{ 
    a = 12; 
    spawn(&myThread); 
    Thread.sleep(2.seconds); 
    writeln("From main A=", a); 
} 

答えて

3

変数は、デフォルトではスレッドローカルです。 sharedまたは__gsharedを使用してください。

+0

ああ、もちろん、私はこれを知っていましたが、この文脈では考えていませんでした。 C + +とDの危険性は私が似ている。ありがとうございました。 – jcoder

関連する問題