2

我继承了一些代码,这些代码具有一组通过在单独线程上运行的串行链接捕获的实时值:

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

线程只是将数据存储到没有锁定或其他同步的字段中。对我来说,这看起来像是一大堆比赛条件。所以我想给它增加一些安全性。问题是,什么是最好的?

我可以使 int 字段不稳定。但是,不能用十进制类型做到这一点。互锁可以帮助解决这个问题,尽管很混乱,使用拳击。或者我可以添加一个锁定对象

private static readonly object lockObj = new object();

然后访问所有内容。但这会锁定所有字段,即使它一次只修改一个字段。我不能锁定原语,这无论如何都是不好的形式,为每个字段添加一个锁定对象看起来很浪费。那么有没有更好的方法呢?

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 回答