2009-09-04 4 views
1

C#ASP.NETプロジェクトに静的変数(抽象データ型、プリミティブではありません)があります。asp.netで静的なvarを読み書きするロック

多くのスレッドで同時に並行して頻繁に読み込まれます。

(読み込み回数に比べて)非常にまれに書く必要があります。

threadsafteyを確実に書いて、他のスレッドが部分的に書き込まれたデータを読み込まないようにするには、どうすればよいですか?

私は今までlockを使用しましたが、私は、これは同時読み取り:(

おかげ

答えて

5

私はちょうどlockから始めたい非コンテストロックは非常に安いあなたあなたが.Nを使用していると仮定すると(ReaderWriterLockSlimを使用することができます。 ET 3.5)しかし、ロックはより簡単に行えます。それが問題になったときに最適化する。

ストレートReaderWriterLockが良くシンプルなロックより遅くなることがあります - それは早く、それはあるかもしれないようではありません、したがって、スリムバージョン:)

どれだけ頻繁にあなたが「頻繁」によって意味ですか?どのくらいの競合が予想されますか?それをモデル化(例:妥当な数の要求をシミュレート)し、単純なロッキングと単純なロッキングをベンチマークして、オーバーヘッドを確認することができます。

あなたはvolatileのロックフリーオプションを使用することができるかもしれ - しかし、率直に言って、私は最近について推論するためにまともな人のためのようにあまりにも難しいことをあきらめました。 (それは私がそれが意味すると思ったことを意味するものではありません)

あなたは実際にデータで何をしていますか?型は不変型なので、適切な参照を取得したら、ロックなしでスレッドセーフな方法で読み取ることができます。

+0

良いですadvice-。 – RichardOD

+0

@ Andrew-もしあなたがそれについてもっと知りたいなら、ここに良い記事があります。http://blogs.msdn.com/pedram/archive/2007/10/07/a-performance-comparison-of-readerwriterlockslim-readerwriterlock .aspx – RichardOD

+0

アドバイスをいただきありがとうございます。私はすべてのリクエストで、トラフィックがあるほど頻繁に読んでいます。執筆は1日1回のオーダーで行われます。 –

0

お手数をおかけしていただきありがとうございます。パフォーマンスが問題になるまで、このアプローチに着手しました。おそらくこれはSharedResourceは不変である(スレッドセーフ)、正しい

public static class SharedResourceManager 
{ 
    private static readonly object syncLock = new object(); 

    private static SharedResource res { get; set; } 

    public static SharedResource Resource 
    { 
     get 
     { 
      lock (syncLock) 
       return res; 
     } 
     set 
     { 
      lock(syncLock) 
       res = value; 
     } 
    } 
} 
あなたはそれについて読んでない限り、あなたは間違った選択をしてしまう可能性がある.NET Frameworkの奇妙の一つである
+0

はい、それは安全です。揮発性のプライベート変数を使用すると大丈夫でしょう。それはプライベートであるので、あなたは 'res'のために全くプロパティを使用している理由は何ですか? –

+0

助けてくれてありがとうございます:)理由はありません。 –

関連する問題