【发布时间】:2015-03-14 23:55:54
【问题描述】:
我正在使用遗传算法构建优化程序。我使用 Parallel.For 来减少时间。但它导致了一个与下面代码相同的问题:
class Program
{
static void Main(string[] args)
{
int j=0;
Parallel.For(0, 10000000, i =>
{
j++;
});
Console.WriteLine(j);
Console.ReadKey();
}
}
每次我运行上面的程序时,它都会在 0 到 10000000 之间写入一个不同的 j 值。我猜它不会等待所有迭代完成。它传递到下一行。 我应该如何解决这个问题?任何帮助将不胜感激。谢谢。
版本: Interlocked.Increment(ref j);子句解决了意想不到的结果,但是当我与正常的 for 循环相比时,这个操作会导致大约 10 倍的时间。
【问题讨论】:
-
使用
Interlocked.Increment(ref j) -
这是一个概念验证,还是您真的想将一千万个整数相加?
-
这只是一个概念验证
-
不是互锁增量使并行循环花费更长的时间。这是初始化/启动/拆除并行生成的一千万个线程的开销。你无法摆脱这种开销。你能做的就是把真正的工作放在循环体中;当这项工作(例如,遗传算法一步“制作后代并评估它”)比您将通过并行获得的线程管理开销大得多时。如果工作量足够大,下一个陷阱是它们可能需要在共享结构上互锁,这可能会扼杀加速。
标签: c# parallel-processing parallel.for