2009-08-21 3 views
0

여기에 문제의 코드의 (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으로 성능이 향상 되었습니까? (이 문제에 대해 어떻게 할 수 있습니까?)

답변

4

정말로 두 가지 수준의 병렬 처리가 필요합니까? 상위 노드를 병렬 처리하는 것만으로 충분하지 않습니까?

어쨌든 좋은 생각이 아니라면 잠금없이 여러 스레드에서 List<T>에 글을 씁니다. 그러나 PFX는 사용자의 필요에 맞는 동시 수집을 제공합니다 : ConcurrentBag. 그것은 (lock-free가되도록) 정렬되지 않았지만 여기서 스레드 간의 상호 작용이 주어지면, 그것은 당신에게 문제가되지 않는다고 생각합니다.

+0

예, 부모 노드 병렬 처리에만 관심이 있습니다. 내부 루프는 순차적입니다. ConcurrentBag 참조 주셔서 감사합니다. 그건 내 필요에 맞는 것 같습니다. –