代码之家  ›  专栏  ›  技术社区  ›  J D

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

  •  3
  • J D  · 技术社区  · 14 年前

    另外,我注意到基于链表的设计会导致大量的分配,这会破坏可伸缩性。这是令人惊讶的,因为这些集合的唯一目的是多核编程。这是一个固有的限制还是它们只是执行得不好?

    4 回复  |  直到 14 年前
        1
  •  0
  •   Dmitry Lomov    14 年前

    在回答问题的第二部分时,您说得很对,尽管.NET4.0中的并发集合实现试图实现无锁,但它们仍然位于非无锁内存分配子系统之上。

    内存管理是所有无锁数据结构的祸根:下面是一个关于最新技术的演示: http://sysrun.haifa.il.ibm.com/hrl/ISMM2009/program.html#7

        2
  •  11
  •   Reed Copsey    14 年前

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

    新的 ConcurrentQueue<T> ConcurrentStack<T>

    另外,我想指出一件事——你在第二段中有两个误解。链表对于可伸缩性来说并不是特别糟糕。内存分配可能需要定期进行(尽管有一些方法可以解决这个问题),但通常情况下,在可伸缩性方面,这比其他潜在问题付出的代价要小(这真的取决于场景……)还有,新的 ConcurrentStack<T> 类不是基于(至少是传统的)链表的。它们是一个无锁类,内部使用数组的链表来保存元素,更像 std::deque .

        3
  •  3
  •   Pavel Minaev    14 年前

    我可以想象,基于链表的设计是为了使它无锁。它的可扩展性有什么问题,您还考虑了哪些其他选项?

        4
  •  2
  •   Dmitry Lomov    14 年前

    这里有一篇最近的博客文章,它精确地涵盖了您所关注的问题(使用ConcurrentBag和TPL的GC问题),建议了在现场发现和分析这个问题的方法(VS2010 Concurrency Visualizer)。部分解决方案建议使用服务器GC。

    http://blogs.msdn.com/b/hshafi/archive/2010/06/17/case-study-parallelism-and-memory-usage-vs2010-tools-to-the-rescue.aspx?wa=wsignin1.0