簡體   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