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