c# - ReaderWriterLockSlim 或 Lock

标签 c# multithreading synchronization locking readerwriterlockslim

我正在使用 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 有什么好处?原因是,我不希望此操作阻止传入请求。

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

有什么想法吗?评论?

最佳答案

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

除非你只是想阻止其他线程在你清空包时拿东西或向包中添加东西。

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

如果您锁定包,那么在您的代码运行时,其他线程将无法添加或删除内容。当然,假设您用锁保护其他所有进入包的 channel 。一旦你这样做了,你就完全违背了拥有无锁并发数据结构的目的。您的数据结构已成为一个由锁控制的性能不佳的列表。

如果你使用读写锁也是一样的。您必须同步每个 访问。

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

关于c# - ReaderWriterLockSlim 或 Lock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7614156/

相关文章:

c# - 引用类型。我理解正确吗?

c# - 为什么我不能将 Action<Int32> 转换为 Action<Object>?

Django + 执行异步进程?

java - Java如何正确添加同步

operating-system - 操作系统 : Peterson's solution

C#:你能检测出当前执行上下文是否在 `lock (this)` 内吗?

c# - Entity Framework + LINQ + "Contains"== 超慢?

c# - 在 C# 中使用正则表达式拆分字符串上的标记

linux - 如何使用多线程进行 zlib 压缩(相同输入源)

java - Spring 和编程式事务管理的连接池问题