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