2013-03-28 23 views
0

我已经阅读了很多关于缓存和线程同步的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和字符串),并不真正大(百元素不多)。

所以,我不想锁定读取方法以避免同步开销,因为它在大多数情况下不是必需的,但是我希望在资源需要更新时使用它。

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

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方法?

编辑:

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

回答

0

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

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

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

+0

我知道框架中有一个并发的词典,但我认为它锁定了读取的数据,这就是我想要避免的。我只需要将其锁定在更新上(这不会经常发生)。 – ppetrov 2013-03-29 10:46:22