2011-01-24 7 views
9

Le code ci-dessous crée simplement une liste> de nombres aléatoires, puis calcule la somme cumulative de chaque liste dans une boucle foreach parallèle. Pourquoi est-ce que je reçois moins que les évaluations 'numLists'? Souvent vers 9990. Je suppose que cela a quelque chose à voir avec la sécurité des threads. Qu'est-ce qu'une méthode alternative? (Je suis un débutant C# donc j'espère que j'utilise des termes corrects) Merci.parallel foreach loop - comportement impair

using System; 
using System.Collections.Generic; 
using System.Threading.Tasks; 

namespace testParallelForeach 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      List<List<double>> bsData = new List<List<double>>(); 
      List<List<double>> cumsumDataP = new List<List<double>>(); 
      int numLists = 10000; 
      int myLen = 400; 
      Random rand = new Random(); 
      for (int i = 0; i < numLists; i++) 
      { 
       bsData.Add(new List<double>()); 
       for (int j = 0; j < myLen; j++) 
       { 
        bsData[i].Add(rand.NextDouble()); 
       } 
      } 
      Parallel.ForEach(bsData, a => cumsumDataP.Add(CumulativeSumParallel(a))); 
      Console.WriteLine("cumsumDataP.Count={0}", cumsumDataP.Count); 
      Console.ReadKey(); 

     } 

     public static List<double> CumulativeSumParallel(List<double> singleRetSeries) 
     { 
      int r = singleRetSeries.Count; 
      List<double> cumsumList = new List<double>(); 

      cumsumList.Add(singleRetSeries[0]); 
      for (int i = 1; i < r; i++) 
      { 
       cumsumList.Add(cumsumList[i - 1] + singleRetSeries[i]); 
      } 
      return cumsumList; 
     } 
    } 
} 

Répondre

11

List<T> est en effet pas thread-safe, donc cumsupDataP.Add(...) laisse tomber les données de façon imprévisible.

Remplacez cette ligne par:

ConcurrentBag<List<double>> cumsumDataP = new ConcurrentBag<List<double>>(); 

et travaillerez tous. Notez que ConcurrentBag<T> est non ordonnée, mais ce qui est bien parce que vous avez aucun moyen de prédire l'ordre des fils de toute façon, p