여기에 문제의 코드의 (C#에서) 멀티 스레드, 잠금 장치가없는 목록을 impliment하기 : 런타임에PLINQ 문제/기술
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에 널 (null) 참조를 떠나는 코드를. 일반적인 (비 병렬) ForEach가 ForAll 대신에 호출되면 문제가 사라지기 때문에 이것은 스레드 잠금 때문일 것으로 판단됩니다.
PLINQ 구현에서 'levelNodes.Add (child);' 또한 때때로 "Source array was not enough."라는 메시지와 함께 IndexOutOfRangeException을 던지기도합니다. srcIndex와 length 및 배열의 하한을 확인하십시오. "
이 문제를 해결하기위한 제안 사항이 있습니까?
또는 lock-free List implimentation으로 성능이 향상 되었습니까? (이 문제에 대해 어떻게 할 수 있습니까?)
예, 부모 노드 병렬 처리에만 관심이 있습니다. 내부 루프는 순차적입니다. ConcurrentBag 참조 주셔서 감사합니다. 그건 내 필요에 맞는 것 같습니다. –