ReaderWriteLockSlim或Lock

Dar*_*der 3 c# multithreading synchronization locking readerwriterlockslim

我使用ConcurrentBag在运行时存储对象.在某些时候,我需要清空行李并将行李内容存储到列表中.这就是我做的:

        IList<T> list = new List<T>();

        lock (bag)
        {
            T pixel;

            while (bag.TryTake(out pixel))
            {
                list.Add(pixel);
            }
        }
Run Code Online (Sandbox Code Playgroud)

我的问题是同步,据我在书中读到的锁比其他同步方法更快.来源 - http://www.albahari.com/threading/part2.aspx.

性能是我的第二个问题,我想知道我是否可以在此时使用ReaderWriterLockSlim.使用ReaderWriterLockSlim会有什么好处?原因是,我不希望此操作阻止传入的请求.

如果是,我应该使用可升级锁吗?

有任何想法吗 ?评论?

Jim*_*hel 5

我不确定你为什么要使用锁.背后的整个想法ConcurrentBag是它是并发的.

除非你只是试图阻止其他一些线程在你清空时把东西拿走或者添加东西.

重新阅读你的问题,我很确定你根本不想在这里同步访问.ConcurrentBag允许多个线程TakeAdd,无需你做任何显式同步.

如果你锁定了包,那么在你的代码运行时,没有其他线程可以添加或删除东西.当然,假设您使用锁保护其他所有对包的访问.一旦你这样做,你就完全失去了拥有无锁并发数据结构的目的.您的数据结构已成为一个由锁控制的性能不佳的列表.

如果您使用读写器锁,也一样.您必须同步每个访问.

在这种情况下,您无需添加任何显式同步.抛开锁.