質問

私が書く価値分野では、何の保証の取得に関する時に新しい価値を保存するメインメモリ?例えば、どのようなのを知っているプロセッサー好きが止まらない、新たな価値をもつ民間のキャッシュが更新されるメインメモリ?
別の例:

int m_foo;

void Read() // executed by thread X (on processor #0)
{
   Console.Write(m_foo);
}

void Write() // executed by thread Y (on processor #1)
{
   m_foo = 1;
}

する可能性はないの後で Write() 完成した実行、その他のスレッドの実行 Read() でも実際には"0"としての現在の価値とは?(年も前に書き込みm_fooなフラッシュには解決していません。.
どのようなプリミティブ(横ロック)をご用意しております。を確保するのに書き込みしたフラッシュ?


編集
のサンプルコードを使い、書く、読み取れ異なる方法です。います。MemoryBarrierのみに影響を与え指導reordingに存在する同じスコープ?

また、それなinlinedのJIT、どういう価値を書き込m_fooなされるまでに登録のメインメモリ?がm_fooの読み込みではなく、古い値からのCPUキャッシュ).

はを達成することが可能となりこを使用せずにロックを揮発性の'キーワード?(もちゃを使用しないプリミティブ型が語サイズの構造体 【揮発性には適用されません].)

役に立ちましたか?

解決

揮発性と連動して述べさせていただき、またプリミティブは、ほかのリストを使用 Thread.MemoryBarrier() 前の書き込みや読み込み.この保証並べ替えを行うメモリの書き込み-読み出しを行う.

ここでは"できるようになりましたか lock, Interlockedvolatile で自動的に多くなります。を使用できることの交換、その他の技術では世界で最も硬いパスへの旅行は、こう語るのはMSDN:

"それは難しいので正しく並行マルチスレッドプログラムを使用 MemoryBarrier.ほとんど目的とする C#ロック、Visual Basic SyncLock算書の方法 モニタークラスを提供す 低エラーが発生しやすいの方の同期 メモリからです。ることをお勧めしま 利用だということになるだろうMemoryBarrier."

使い方MemoryBarrier

ポリエステルの例の実装 VolatileReadVolatileWrite, できることを内部で使用 MemoryBarrier.基本原則に従うには:を閲覧しているときに変数、バリアメモリ の読み出します。書くときに、メモリのバリアを越 しまいました。

場合にはんだ疑いのかということの効率が低下し lock, ることを考えてロックはあくまでもそして"フルフェンシング"というのも、場所、メモリのバリア前後のコードブロックを無視してモニターしてあげます。※この原理が説明できないとされているこ 優れた決定版の記事のスレッド、ロック、揮発性記憶障害によるAlbahari.

からリフレクタ:

public static void VolatileWrite(ref byte address, byte value)
{
    MemoryBarrier();
    address = value;
}

public static byte VolatileRead(ref byte address)
{
    byte num = address;
    MemoryBarrier();
    return num;
}

他のヒント

したい場合についてアフターサービスについて書かつ速やかに、そしてマークとして volatile, は、これらの痛み)の使用 Thread.VolatileRead / Thread.VolatileWrite (オプションがあり、簡単に見つ、無駄な).

volatile int m_foo;

その他ご質の保証を与えるもの(ていし、複数のスレッド).

また見たいと思いロック(Monitor 又は Interlocked, うに、同様の効果が得られ どの アプローチを使用からすべてのアクセス(すべての lock, は、すべての Interlocked, します。

ときには入れないでくださいsynchronisationする保証はないスレッドラワンプロセッサーは、化されたコードを生成するために別のスレッドもプロセッサーことになるので値がキャッシュするのCPUキャッシュやCPUするものとする。

そのために必要なもののいずれかの変数として激しい動きを示している。を生み出すものを"起こる前に'-realation間を読み込み、書き込みます.

そうでないプロセッサーのキャッシュの問題です。書き込みは通常通り(書き込みに行くの両方をキャッシュメモリ)のすべてを読み込みアクセスできますものが多くその他のキャッシュの(プログラミング言語、図書館、オペレーティングシステム、 I/O バッファます。コンパイラを選択することもでき続可変プロセッサを登録させることなく書きるメインメモリ(その揮発性のオペレーターは、保管は避けてくださ価値を登録できる場合には、メモリマップドI/O)

が複数ある場合にはプロセスは複数のスレッドおよびsynchronisationは問題だらなければならないexplictlyあり、多くの文について教えてくださいによって使用。

単一のネジ付きプログラムを気にしない、コンパイラなので、読み込みアクセスにどが記されています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top