2011-01-24 21 views
9

El código siguiente simplemente crea una Lista> de números aleatorios y luego calcula la suma acumulativa de cada lista en un bucle foreach paralelo. ¿Por qué recibo menos de las evaluaciones de 'numLists'? A menudo alrededor de 9990. Supongo que tiene algo que ver con la seguridad del hilo. ¿Qué es un método alternativo? (Soy un principiante de C#, así que espero usar los términos correctos) Gracias.bucle foreach paralelo - comportamiento impar

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; 
     } 
    } 
} 

Respuesta

11

List<T> de hecho no es hilo de seguridad, por lo cumsupDataP.Add(...) está bajando datos de manera impredecible.

reemplazar esa línea con:

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

y lo hará todo el trabajo. Tenga en cuenta que es ConcurrentBag<T> desordenada, pero eso está bien porque tiene hay manera de predecir el orden de las roscas de todos modos; p

Cuestiones relacionadas