は、私はいくつかのループの実行を制御するフィールドを持っていると仮定今これはThread.MemoryBarrier()の正しい使用ですか?</p> <pre><code>private static bool shouldRun = true; </code></pre> <p>そして、私のようなコードがあるスレッドの実行、持っている:
while(shouldRun)
{
// Do some work ....
Thread.MemoryBarrier();
}
を、別のスレッドは、false
からshouldRun
を設定することもできます同期メカニズムを使用しないでください。
whileループの中でこの呼び出しを行うと、Thread.MemoryBarrier()を理解する限り、キャッシュされたバージョンのshouldRun
がワークスレッドによって取得されなくなり、無限ループが発生するのを効果的に防止できます。
Thread.MemoryBarrierについての私の理解は正しいですか?shouldRun
変数を設定できるスレッドがあれば(これは簡単に変更できません)、これはループが一旦停止することを保証するうえで妥当な方法ですか?shouldRun
はどのスレッドでもfalseに設定されていますか?これは最新のを達成するために必要であれば、揮発性としてshouldRunの宣言は、メモリバリアを実行するので、この場合Thread.MemoryBarrier();
で
は揮発そうであるように、ブールを宣言しません同じこと?私はThread.MemoryBarrierについては分からないので、コメントには答えません。例えばhttp://www.albahari.com/threading/part4.aspxAnother> "この問題を解決するより高度な方法は、_completeフィールドにvolatileキーワードを適用することです。volatileキーワードは、コンパイラにすべてのそのフィールドからの読み取り、およびそのフィールドへのすべての書き込み時の解放フェンス」を参照してください。よろしくお願いします。 –
揮発性は非常に悪いものであり、使用しないでください。http://blogs.msdn.com/b/ericlippert/archive/2011/06/16/atomicity-volatility-and-immutability-are-different-part -three.aspx – Steven
Lol、私はそれを知らなかった!元のC/asmプログラマとして、私はそれが良いことだと思った:)リンクをありがとう、私は見てみましょう。 –