C# Bug in Threading.Task.Parallel.For?

本文关键字:Parallel For Task Threading Bug in | 更新日期: 2023-09-27 17:50:22

这个bug是在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中的bug。

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}

C# Bug in Threading.Task.Parallel.For?

Random类被明确地记录为而不是线程安全的。

你在错误的地点和时间以错误的方式使用了错误的类。

库中没有bug。

编辑

这里的简短解决方案是Random()Parallel.For()不能很好地结合在一起。只是替换平行。对于正常的for(;;)回路。对于32k元素,您不会注意到差异。

如果你仍然想并行,你必须分割范围,运行几个任务,并给每个任务它自己的随机实例。

在多线程情况下,随机总是不好的。

阅读:http://msdn.microsoft.com/en-us/library/system.random.aspx

这是微软员工写的一篇很棒的博文,介绍了在并行循环中处理生成随机数的不同方法及其性能影响:

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