如何在C#中同步值集合

时间:2012-12-05 14:39:55

标签: c# synchronization

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

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

线程只是将数据存储到字段中,没有锁定或其他同步。对我而言,看起来像是一片混乱的海洋。所以我想为它增加一些安全性。问题是,什么是最好的?

我可以将int字段设置为volatile。但是,不能用小数类型做到这一点。联锁可以帮助解决这个问题,尽管很麻烦,使用拳击。或者我可以添加锁定对象

private static readonly object lockObj = new object();

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

1 个答案:

答案 0 :(得分:3)

您可以使用ReaderWriterLockSlim根据所需的访问级别进行锁定。你可以把它们变成一个属性来做得更好:

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

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

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

这允许多次读取和单次写入。