C # Ошибка в Threading.Task.Parallel.For? - PullRequest
0 голосов
/ 15 апреля 2011

Это ошибка в Parallel.For?

   public class DataPoint
        {
            public int Game { get; set; }
            public byte Card { get; set; }
            public byte Location { get; set; }
            public DataPoint(int g,byte c,byte Loc)
            {
                Game = g;
                Card = c;
                Location = Loc;
            }
            public override string ToString()
            {
                return String.Format("{0} {1} {2}",Game,Card,Location);
            }
        }

Это должно быть ошибка в Parallel.For

private static System.Collections.Concurrent.ConcurrentBag<DataPoint> FillData()
    {
        var points = new System.Collections.Concurrent.ConcurrentBag<DataPoint>();
        long c = 32768;
        long z = 0;
        Parallel.For(z, c, (i) =>
        {
            points.Add(new DataPoint( rand.Next(1, 100001),
                                      (byte)rand.Next(1, 144),
                                      (byte)rand.Next(1, 40)));
            });
        return points;
    }

работает

private static System.Collections.Concurrent.ConcurrentBag<DataPoint> FillData()
    {
        var points = new System.Collections.Concurrent.ConcurrentBag<DataPoint>();
        long c = 32769;
        long z = 0;
        Parallel.For(z, c, (i) =>
        {
            points.Add(new DataPoint( rand.Next(1, 100001),
                                      (byte)rand.Next(1, 144),
                                      (byte)rand.Next(1, 40)));
            });
        return points;
    }

По умолчанию каждый не равен {1,1,1}

Ответы [ 3 ]

7 голосов
/ 15 апреля 2011

Класс Random явно задокументирован как , а не Потоково-безопасный.

Вы используете неправильный класс в неправильном месте + время неправильно.

В библиотеке нет ошибок.

Редактировать

Краткое решение здесь заключается в том, что Random() и Parallel.For() плохо сочетаются друг с другом. Просто замените Parallel.For обычным циклом for(;;). Для элементов 32k вы не заметите разницы.

Если вы все еще хотите, чтобы это было параллельно, вам придется разделить диапазон, запустить пару задач и дать каждой задаче собственный случайный экземпляр.

6 голосов
/ 15 апреля 2011

Randoms никогда не хороши в многопоточных ситуациях.

Чтение: http://msdn.microsoft.com/en-us/library/system.random.aspx

1 голос
/ 16 сентября 2011

Вот замечательное сообщение в блоге сотрудника MSFT о различных методах обработки случайных чисел в параллельных циклах и их последствиях для производительности:

http://blogs.msdn.com/b/pfxteam/archive/2009/02/19/9434171.aspx

...