缓存,仅在更新资源时同步线程

时间:2013-03-28 08:19:17

标签: c# caching thread-synchronization

我在SO和其他网站上已经阅读了很多关于缓存和线程同步的内容,但我仍然无法得到我的问题的答案。

.NET Thread Safety for Static Dictionary Cache

How does lock work exactly?

Why are locks performed on separate objects?

http://msdn.microsoft.com/en-us/magazine/cc188793.aspx

...

我正在尝试实现一个缓存,该缓存公开只从外部读取的资源。 这些资源可以更新,但不会经常发生,也不会花费太多时间。

基本上资源是键值列表(id和string),并不是很大(百元素不多)。

所以,我不想锁定read方法以避免同步开销,因为大部分时间都不需要,但我想在需要更新资源时使用它。

我的问题是:有没有办法做这样的事情:

public class AFTypeCache<T> where T : class
{
   private Dictionary<int, T> _types;
   private Func<Dictionary<int, T>> _dataProvider;
   private readonly object _sync = new object();

   public void UpdateData()
   {
       // here something (?) to make sure no more threads are reading the resource
       lock (_sync)
       {
           _types = _dataProvider();
       }
   }

   public IEnumerable<int, T> Get()
   {
       // thought about something like that but I'm pretty sure this won't work...
       if (_updating)
       {
           lock
           {
                return _types;
           }
       }
       else
       {
           // I know not the way to get enumerator but that's not the point
           return _types;
       }
   }
}

此外,尝试实现这一点是否真的很有用,或者我是否采取了错误的方式并且应该在Get方法中使用锁定?

修改

好了一些谷歌搜索后,我会有一个更准确的问题:是否有可能知道其他线程是否正在使用类引用,如果是,请等待这些线程完成使用它?

1 个答案:

答案 0 :(得分:0)

我错过了什么或者您正在尝试创建并发字典?如果是这样,为什么不使用框架呢? (http://msdn.microsoft.com/en-us/library/dd287191.aspx

你可以用并发字典(或你自己的版本)来解决你的问题,使用线程id和类名作为键,值是一个布尔值,表示类的用法在线程中。

但我看不出有任何理由这样做,并发框架中已经存在并发字典。