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}
答案 0 :(得分:7)
Random类明确记录为 not Thread-safe。
你在错误的地方错误地使用错误的课程+时间错误。
库中没有错误。
这里的简短解决方案是Random()
和Parallel.For()
不能很好地结合在一起。只需用正常的for(;;)
循环替换Parallel.For即可。对于32k元素,您不会注意到差异。
如果您仍然需要并行,则必须拆分范围,运行几个任务并为每个任务提供自己的Random实例。
答案 1 :(得分:6)
在多线程情况下,Randoms永远不会好。
阅读:http://msdn.microsoft.com/en-us/library/system.random.aspx
答案 2 :(得分:1)
以下是MSFT员工撰写的关于处理在并行循环中生成随机数及其性能影响的不同方法的精彩博文:
http://blogs.msdn.com/b/pfxteam/archive/2009/02/19/9434171.aspx