2012-02-23 14 views
1

私はvolatileを使用しようとしました....グローバル変数が新しいスレッドで初期化されない

qは、クラス内のどのメンバーからもアクセスできるグローバル変数です。 私は スレッドtを作成する必要がありますか?クラスAで?

class A 
{ 
    string q; 
    public void SomeMethod() 
    { 
     new Thread(Method()).Start(); 

     Console.WriteLine (q); //this writes out nothing 
    } 
    private void Method() 
    { 
     q = "Hello World"; 
    } 
} 

答えて

4

メインスレッド、Console.WriteLine(q)を実行し1は、その行を実行すると、あなたが始めた新しいスレッドが変数の値を設定する機会を持って前に出ています。

スレッド同期に関するいくつかの調査を行います。

+0

yup(:ありがとう、私はそれを自分自身で考え出した。スレッドの開始にそれほど時間がかかるとは思わなかった –

+2

@LawrenceLタスクが実行可能な同期方法としてどれくらいの時間がかかっているかに頼ることを考えてください。 –

+5

@ LawrenceL:スレッドの開始には、CPUの観点から見てどれくらいの時間がかかるので、1世紀かかっていると仮定します。スレッドの開始は最低でも数百万回* *信じられないほど高価なリソース**あなたが新しいチームメンバーを雇うことについて考える方法をスレッドと考えると、数ヶ月かかる可能性があり、そのためには非常に高価で、仕事をするのが良いでしょう。 –

1

(これはので、あなたの脳はあなたのコードが動作しない理由を把握している注意してくださいそれは、使用するパターンのための提案はありません - コメントクリスに感謝。)これを試してみてください:

class A 
{ 
    string q; 
    public void SomeMethod() 
    { 
    new Thread(Method()).Start(); 
    //Add this so the thread finishes (not a good permanent solution) 
    Thread.Sleep(500); 
    Console.WriteLine (q); //this writes out nothing 
    } 
    private void Method() 
    { 
    q = "Hello World"; 
    } 
} 

なぜこれがあります仕事に行く?なぜなら、最初のスレッドには、コンソールに書き込む前に作業を終えることができるからです。これは、一方のスレッドが書き込み中で他方が設定中であることを意味します。

ここで、qを変更/取得するときに、変数をロックする方が良いでしょう。この例では単純なロックが問題ありません。設定したときとコンソールに書き込むときの両方で変数をロックするだけです。

+0

進行中のSOのトピックを参照してください。http://stackoverflow.com/questions/9 417260/when-is-it-sensible-to-use-thread-sleep –

+0

@Chris Slain:これはデモンストレーションの目的のみでした。私はもっ​​と明確にすべきだったと思います(今編集中) –

+0

汗がかからない - FWIW私はこれをdownvoteしませんでした。 –

-1

新しいスレッドの実行を待つ実行をブロックしていません。あなたはそれが何かを書くようにしたい場合は、waitHandleまたはこのような本当に簡単ブールフラグを使用することができます。

class A 
{ 
string q; 
bool hasBeenSet; 
public void SomeMethod() 
{ 
    new Thread(Method()).Start(); 

    while(!hasBeenSet) 
    { 
     Thread.Sleep(10); 
    } 

    Console.WriteLine (q); //this writes out nothing 
} 
private void Method() 
{ 
    q = "Hello World"; 
    hasBeenSet = true; 
} 
} 

ことが言われますが、あなたは本当にWaitHandlesと同期オブジェクト/パターンに関するいくつかの研究を行う必要があります。

+1

シンプルな結合でビジーウェイトを行うのはなぜですか? – Servy

関連する問題