3

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

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

        lock (bag)
        {
            T pixel;

            while (bag.TryTake(out pixel))
            {
                list.Add(pixel);
            }
        }

我的问题是同步,据我所知,书锁比其他同步方法快。来源——http: //www.albahari.com/threading/part2.aspx

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

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

有任何想法吗 ?评论?

4

2 回答 2

5

我不知道你为什么要使用锁。背后的整个想法ConcurrentBag是它是并发的。

除非您只是想阻止其他线程在清空袋子时拿走东西或将东西添加到袋子中。

重新阅读您的问题,我很确定您根本不想在此处同步访问。ConcurrentBag允许多个线程TakeAdd,而无需进行任何显式同步。

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

如果您使用读写器锁,同样的事情。您必须同步每次访问。

在这种情况下,您不需要添加任何显式同步。扔掉锁。

于 2011-09-30T17:58:30.453 回答
1

当线程将连续执行大量操作时,锁非常有用(突发 - 低争用)

当您拥有比写锁更多的读锁时,RWSlim 非常棒(读重 - 高读争用)

当您需要多个阅读器和/或编写器同时工作时,无锁非常好(读/写混合 - 大量争用)

于 2011-09-30T21:05:15.383 回答