スレッドセーフでなければならないいくつかのコードがあり、その動作は次のようになります。
protected long m_RunningValue
protected long m_RunningCounter
protected object m_Lock = new object();
public long RunningValue { get { return Interlocked.Read(m_RunningValue); } }
public long RunningCounter { get { return Interlocked.Read(m_RunningCounter); } }
public void DoCalculation(int newValue, int newQuantity)
{
lock(m_Lock)
{
Interlocked.Add(ref m_RunningValueA, newValue);
Interlocked.Add(ref m_RunningCounter, newQuantity);
if(Interlocked.Read(ref newQuantity) == 0)
{
...m_RunningValue gets further modified here
}
}
}
計算は値とカウンターの両方をロックする必要があります。そうしないと、競合状態が if(...) ブロックに影響を与える可能性がありますが、読み取り時に同期する必要はまったくありません。両方を読んでください。それは私にとって 100% 大丈夫です。
読み取りのインターロックは、64 ビット値のスレッドセーフ読み取りのためにあります。
このようにインターロックとロックを混在させても安全ですか? 他の Web ページでそれらを混在させることは安全ではないことを読みましたが、これがそれらを混在させることが微妙なバグを導入するための優れた方法であることを意味するのか、またはシステムレベルでこれが関連するデータ構造を破損する可能性があるのか を明確にすることはできません.
このすべてのインターロック (64 ビット .NET 4.0 ランタイム) のコストは、プロパティ get() メソッドの周りの ReaderWriterSlim ロックを保存する目的を完全に無効にしますか?