[英]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.