日期:2014-05-17  浏览次数:20722 次

求教lock的问题
本帖最后由 niss 于 2013-04-06 15:48:40 编辑
lock可以锁住代码段,但我需要的是像读写锁这种功能,如在写的时候锁住,不允许其他读和写,但在只有读的时候,就不需要被锁住,用lock的话在并发读的时候也会被锁住

大概如下
readonly object _obj = new object();
Dictionary<string,object> _dic = new Dictionary<string,object>();

public void Add(string key,object value)
{
   lock(_obj)
   {
      _dic.Add(key,value);//这里是简写,不严谨
   }
}

public bool ContainsKey(string key)
{
   get
   {
      lock(_obj)
      {
         return _dic.ContainsKey(key);
      }
   {
}

public ICollection<TKey> Keys
{
   get
   {
      lock (_locker)
      {
         return _dic.Keys;
      }
   }
}

这里我不希望在并发调用ContainsKey和Keys的时候被lock,因为它没有发生"写",该如何实现呢?
有个东西不敢确定
lock(_obj)
{
   //写操作
    Monitor.Pulse(_obj);
}

lock(_obj)
{
   Monitor.Wait();
   //读操作
}
这个可以么?

------解决方案--------------------
首先这个问题跟语言的关系不大。
可以自己去查找 操作系统 读者写者 问题的相关解法。
------解决方案--------------------
ReaderWriterLockSlim   net 3.5以上支持,参看msdn

如果3.5以下 需自己实现  去Reflector里自己剥离出来