并发队列和堆栈在.NET 4中的应用

Jon*_*rop 3 .net c# concurrency f#

.NET 4包含新的并发数据结构.Bag和Dictionary集合有明显的应用程序,但我看不到Queue和Stack数据结构的任何用途.人们使用这些是为了什么?

另外,我注意到基于链表的设计会产生大量的分配并破坏可扩展性.鉴于这些集合的唯一目的是多核编程,这是令人惊讶的.这是一个固有的限制还是刚刚实施得很糟糕?

Ree*_*sey 11

堆栈和队列在并发编程中非常有用,就像在顺序编程中一样.

new ConcurrentQueue<T>ConcurrentStack<T>classes提供了一个非常好的,线程安全的Queue和Stack实现.这些在处理多线程生产者/消费者场景时特别有用,因为这两个类都是无锁的(有利于可伸缩性)和线程安全,并且性能相当高.

另外,我想指出一件事 - 你的第二段中有两个误解.链接列表对于可伸缩性并不是特别糟糕.内存分配〜可能需要定期发生(虽然有办法解决这个问题),但通常情况下,这比可扩展性方面的其他潜在问题要小.(这实际上取决于场景......)此外,新的ConcurrentQueue<T>ConcurrentStack<T>类不是基于(至少是传统的)链表.它们是一个无锁类,它在内部使用链接的数组列表来保存元素,更像是std :: deque.

  • @Jon:当声称某些内容"技术上不准确"时,值得详细说明您认为技术上不准确的内容,并纠正这些不准确之处,并参考可能存在争议的主张. (5认同)
  • 嗯,CQ很明显.但并发编程中的LIFO需要一个真实生活的例子.你是否有一个? (2认同)
  • @Jon:ThreadLocal数据与共享数据完全不公平."公平"比较将是从单个List <T>或其他集合中添加和删除,并引入使其行为正常所需的同步.我从来没有说过在所有情况下都应该使用ConcurrentBag,但线程本地存储并不总是一个选项 - 如果你需要一个具有共享状态的集合,你会发现很难击败CB/CS/CQ实现. (2认同)