代码之家  ›  专栏  ›  技术社区  ›  EKS

同一功能中的多个锁

  •  1
  • EKS  · 技术社区  · 17 年前

    在一个函数中多次锁定列表(称为list gList)是一种不好的做法。以便以后再次锁定(基本上在执行查找时锁定,解锁准备插入的新项,然后再次锁定并添加新项)。

    当我给你一个剖析器的时候,我没有看到任何迹象表明我为此付出了沉重的代价,但是我能在以后或者当代码在野外发布的时候吗?有人在这方面有过最好的实践经验或个人经验吗?

    4 回复  |  直到 17 年前
        1
  •  5
  •   Fredrik Mörk    17 年前

    如何执行锁定?您可能需要考虑使用 ReaderWriterLockSlim ,如果情况并非如此。

    class SomeData
    {
        private IList<string> _someStrings = new List<string>();
        private ReaderWriterLockSlim _lock = new ReaderWriterLockSlim();
    
        public void Add(string text)
        {
            _lock.EnterWriteLock();            
            try
            {
                _someStrings.Add(text);
            }
            finally
            {
                _lock.ExitWriteLock();
            }
    
        }
    
        public bool Contains(string text)
        {
            _lock.EnterReadLock();
            try
            {
                return _someStrings.Contains(text);
            }
            finally
            {
                _lock.ExitReadLock();
            }
        }
    }
    
        2
  •  1
  •   Jacob B    17 年前

    这就是说,请确保您在适当的情况下进行配置:一个同时具有大量负载的配置文件。否则,你的结果与现实几乎没有关系。

        3
  •  1
  •   Eugeniu Torica    17 年前

        4
  •  1
  •   UncleO    17 年前

    听起来您不想释放查找和插入之间的锁。要么这样,要么在查找过程中根本不需要锁定。

    是否仅当元素不存在时才尝试添加到列表中?如果是这样,那么在准备元素时,释放两个步骤之间的锁允许另一个线程添加到列表中。当您准备添加时,您的查找已过期。