2009-07-23 7 views
7
class StopIt 
{ 
    private bool stop; 

    void Loop() 
    { 
    while (!stop) 
    { 
     // work 
    } 
    } 

    void Stop() 
    { 
    stop = true; 
    } 
} 

アトミック操作です基本的には、ループの方法は1つのスレッドで実行されていると停止が他から呼び出された場合の動作は正常に停止しますか?私はboolの読み書きが原子的であることを理解しています。しかし、これで十分ですか?スレッドループがすぐに停止しない場合は、問題があります。私はストップ揮発性をマークする必要がありますか?が十分

+0

私のルール:あなたは何が揮発性を意味するのか正確にわからないなら、あなたはロックフリーのプログラムを書くべきではありません。あなたは質問をしているので、あなたはそれが何を意味するのか分からない。したがって、ロックフリープログラムを作成しようとしないでください。安全です。ロックを使用してください。ロックは競合すると高価です。 (1)パフォーマンスの問題がある、(2)ロックが問題の原因である、(3)プロセッサのハードウェアレベルまでの揮発性の意味を理解していることが確認できるまで、ロックフリーにしないでください。 –

+0

停止にアクセスしたときにロックを使用しないでください。もしそうなら、私はどのようにwhileループで読み取りアクセスをロックするのですか? –

+1

@yummy:whileループでフィールドに直接アクセスするので、読み込みをロックするのは難しいです。その読み込みをプロパティ(またはメソッド)にカプセル化する場合は、値を読み込むためにロックを使用できます。 –

答えて

10

はい、間違いなくstopを揮発性としてマークする必要があります。

アトミシティでは十分ではありません。あるスレッドが別のスレッドによって加えられた変更を「参照」することを保証するものではありません。

volatileの私の理解は、現在、いくつかの手術を受けている間、することができますおおよそのような揮発性変数への書き込みの考える「他の人がこれをすぐに見ることができることを確認してください!」 「最新の値を見たい!」という揮発性変数からの読み込みです。

stopを揮発性にすることなく、Stop()が別のスレッドで呼び出されたとしても、そのループは永遠に続く可能性があります。基本的には、JITは変数をレジスタに読み込み、レジスタから永遠に読み込むことができます。

事実、「インラインではない」メソッドを呼び出すことを含む場合、JITは現在でも揮発性の読み取りを強制されていると信じていますが、それは現実的な制限です... の理論それは揮発性にする必要があります。

+0

どのようにして別のスレッドで何が起こるのですか? – KdgDev

+0

これとは逆のことですが、volatileは原子性のためには十分ではありません! – Noldorin

+0

@ Noldorin:この場合は無関係です。ブール値への書き込みは、ECMA 335パーティション1のセクション12.6.6に基づいてアトミックになります。 –

関連する問題