2

別のスレッドで実行されるシリアルリンクを介してキャプチャされる一連のリアルタイム値を持つコードを継承しました。

class Data
{
    public static int nFooCount;
    public static decimal meanValue;
    // Lots more of a variety of types.
}

スレッドは、ロックやその他の同期なしで、データをフィールドに格納するだけです。私には、競合状態の海全体のように見えます。だから私はそれにいくつかの安全性を追加したいと思います。問題は、何が最善かということです。

intフィールドを揮発性にすることができます。ただし、10進数タイプではそれを行うことはできません。インターロックは、ボクシングを使用して、厄介ではありますが、それを助けることができます。または、ロックオブジェクトを追加することもできます

private static readonly object lockObj = new object();

そして、すべてをアクセサします。ただし、一度に1つしか変更しない場合でも、これによりすべてのフィールドがロックされます。プリミティブをロックすることはできません。とにかくそれは悪い形であり、すべてのフィールドにロックオブジェクトを追加するのは無駄に見えます。それで、より良い方法はありますか?

4

1 に答える 1

3

を使用して、必要なアクセスレベルに応じてロックできますReaderWriterLockSlim。それらをプロパティに変換することで、これをより適切に行うことができます。

public int Something
{
   get {
      locker.EnterReadLock();

      try {
         return something;
      } finally {
         locker.ExitReadLock();
      }
   }
   set {
      locker.EnterWriteLock();

      try {
         something = value;
      } finally {
         locker.ExitWriteLock();
      }
   }
}

これにより、複数の読み取りと単一の書き込みが可能になります。

于 2012-12-05T14:44:17.023 に答える