2011-10-20 11 views
4

私はthis MSDN article on lockless thread syncingを読んでいました。この記事では、共有変数にアクセスする前にロックを入力する限り、これらの変数は最新の状態になることを推測しているようです(少なくとも.NET 2.0では)。ロックを使用すると、読み取りと書き込みがキャッシュからフラッシュされますか?もしそうなら、どうですか?

私はこれがどのように可能であるか考えたかったのですか? .Netのロックは、メモリにアクセスする前にすべてのスレッドがチェックする任意のオブジェクトですが、ロック自体はアクセスされているメモリの場所を認識していません。

変数を更新しているスレッド、またはメモリ全体を更新している場合、ロックを開始または終了するときに、これらの更新がCPUキャッシュからどのようにフラッシュされることが保証されていますか?すべてのメモリアクセスがロック内で効果的に揮発性になりますか?

+0

私は多くの経験がありますが、アクセスしているメモリの場所がCPUキャッシュにあるのかどうかは関係ありません。 –

+0

@BenRobinson - ヒープ上の1つの整数にアクセスする異なるコアで2つのスレッドが実行されているとします。この場合、適切な同期方法が適用されていない限り、各スレッドはローカルコアのキャッシュに値のコピーを格納することがあります。 – Polity

答えて

4

はエリックリペットの作業を確認してください:http://blogs.msdn.com/b/ericlippert/archive/2011/06/16/atomicity-volatility-and-immutability-are-different-part-three.aspx

ロックは、メモリロック内の読み取りや変更が一貫して観察されることを保証する、ロックは、一度に1つのスレッドしかメモリの特定の塊にアクセスすることを保証します等々。

そうです、限り、あなたは、共有リソースにアクセスする前に毎回ロックとして、あなたはこれまでで最大

EDITより多くの情報と非常に便利な概要については、次のポストを見てかなり確認することができます:http://igoro.com/archive/volatile-keyword-in-c-memory-model-explained/

+2

興味深いリンク、ありがとう。すべてのC#書き込みが揮発性であることを認識していませんでした!第2のリンクは私の質問に答えます。メモリアクセスはロック内では揮発性ではありませんが、ロックを解放すると書き込みがフラッシュされ、ロックを取得すると読み取りキャッシュがフラッシュされるため、値は最新です。 – GazTheDestroyer

1

まあ、記事では、それを説明する:

  1. は、cを読み込み注釈はロックに入る前に移動します。

  2. ロックを終了しても書き込むことはできません。同一の記事から

そしてより説明:

スレッドがロックを終了し、第3の規則は、ロックが保持している間に行われた書き込みがすべてのプロセッサに対して可視であることを保証します。メモリが別のスレッドによってアクセスされる前に、読み取りスレッドはロックを入力し、第2のルールは、ロックが取られた後に読み取りが論理的に起こることを保証する。

1

すべてのC#メモリの読み書きはvolatile、noです。 (それがパフォーマンス上の場合は想像してください)

しかし、入るとき

はどのようにCPUのキャッシュからフラッシュされることが保証これらの更新は、/ロックを出

CPUキャッシュは、しかし、それらはすべてmemory coherence protocolのいくつかのフォームを持っている、CPU特定されています。つまり、コアからいくつかのメモリにアクセスするとき、別のコアキャッシュに存在する場合、CPUが使用するプロトコルは、データがローカルコアに配信されることを保証します。

しかし、Petar Ivanovが答えていることは、非常に重要です。彼のポイントが何であるかをもっと理解したい場合は、memory consistency modelをチェックしてください。

C#でどのようにメモリが最新であることが保証されているのかは、C#の実装者によって異なります.Eric Lippertのブログは根本的な問題を理解するのには良い場所です。

0

.NETの問題についてはわかりませんが、Javaではこのような方法で協力している2つのスレッドはすべて同じのオブジェクトを使用している必要があります。あなたの紹介文で言えば、ロックだけではありません。これは重要な違いです。

ロックは保護するものを「知る」必要はありません。以前のロッカーで書かれたものがすべて別のロッカーに渡されてから、そのロッカーが進められるようにするだけです。

関連する問題