C#ASP.NETプロジェクトに静的変数(抽象データ型、プリミティブではありません)があります。asp.netで静的なvarを読み書きするロック
多くのスレッドで同時に並行して頻繁に読み込まれます。
(読み込み回数に比べて)非常にまれに書く必要があります。
threadsafteyを確実に書いて、他のスレッドが部分的に書き込まれたデータを読み込まないようにするには、どうすればよいですか?
私は今までlock
を使用しましたが、私は、これは同時読み取り:(
おかげ
C#ASP.NETプロジェクトに静的変数(抽象データ型、プリミティブではありません)があります。asp.netで静的なvarを読み書きするロック
多くのスレッドで同時に並行して頻繁に読み込まれます。
(読み込み回数に比べて)非常にまれに書く必要があります。
threadsafteyを確実に書いて、他のスレッドが部分的に書き込まれたデータを読み込まないようにするには、どうすればよいですか?
私は今までlock
を使用しましたが、私は、これは同時読み取り:(
おかげ
私はちょうどlock
から始めたい非コンテストロックは非常に安いあなたはあなたが.Nを使用していると仮定すると(ReaderWriterLockSlim
を使用することができます。 ET 3.5)しかし、ロックはより簡単に行えます。それが問題になったときに最適化する。
ストレートReaderWriterLock
が良くシンプルなロックより遅くなることがあります - それは早く、それはあるかもしれないようではありません、したがって、スリムバージョン:)
どれだけ頻繁にあなたが「頻繁」によって意味ですか?どのくらいの競合が予想されますか?それをモデル化(例:妥当な数の要求をシミュレート)し、単純なロッキングと単純なロッキングをベンチマークして、オーバーヘッドを確認することができます。
あなたはvolatile
のロックフリーオプションを使用することができるかもしれ - しかし、率直に言って、私は最近について推論するためにまともな人のためのようにあまりにも難しいことをあきらめました。 (それは私がそれが意味すると思ったことを意味するものではありません)
あなたは実際にデータで何をしていますか?型は不変型なので、適切な参照を取得したら、ロックなしでスレッドセーフな方法で読み取ることができます。
をあなたはlock
よりも使用することがより困難であるが、それは同時ことができますReaderWriterLock
を、使用することができなくなります理解読み: http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlock.aspx
お手数をおかけしていただきありがとうございます。パフォーマンスが問題になるまで、このアプローチに着手しました。おそらくこれは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の奇妙の一つである
はい、それは安全です。揮発性のプライベート変数を使用すると大丈夫でしょう。それはプライベートであるので、あなたは 'res'のために全くプロパティを使用している理由は何ですか? –
助けてくれてありがとうございます:)理由はありません。 –
良いですadvice-。 – RichardOD
@ Andrew-もしあなたがそれについてもっと知りたいなら、ここに良い記事があります。http://blogs.msdn.com/pedram/archive/2007/10/07/a-performance-comparison-of-readerwriterlockslim-readerwriterlock .aspx – RichardOD
アドバイスをいただきありがとうございます。私はすべてのリクエストで、トラフィックがあるほど頻繁に読んでいます。執筆は1日1回のオーダーで行われます。 –