繁体   English   中英

隐含多线程,无锁列表的PLINQ问题/技术(在C#中)

[英]PLINQ problem / techniques to impliment multi-threaded, lock-free lists (in C#)

这是有问题的代码:

             parentNodes.AsParallel().ForAll(parent =>
            {
                List<Piece> plist = parent.Field.GetValidOrientations(pieceQueue[parent.Level]);

                plist.ForEach(p =>
                {
                    TreeNode child = new TreeNode(p, parent);
                    var score = child.CalculateScore(root);
                    levelNodes.Add(child);
                });

            });

在运行时,该代码有时会在levelNodes中留下空引用。 我怀疑这是由于线程锁定引起的,因为如果调用普通(非并行)ForEach代替ForAll,问题就会消失。

带有PLINQ的含义是“ levelNodes.Add(child);” 有时还会抛出带有消息的IndexOutOfRangeException:“源数组不够长。请检查srcIndex和length以及数组的下限。”

有什么建议可以消除这个问题?
还是通过无锁List实现可以提高性能? (怎么可能呢?)

在这里,您真的需要两个并行度吗? 仅在父节点上并行化还不够吗?

无论如何,从多个线程写入List<T>而不锁定绝对不是一个好主意。 但是,PFX附带了一个可以满足您需求的并发集合: ConcurrentBag 它是无序的(允许它是无锁的),但是考虑到这里线程之间的相互作用,我想这对您来说不是问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM