Parallel.For不等待所有迭代

ahm*_*ias 0 c# parallel-processing parallel.for

我正在使用遗传算法构建优化程序.我使用Parallel.For来减少时间.但它导致了一个问题,在下面的代码中是相同的:

class Program
    {
        static void Main(string[] args)
        {
            int j=0;
            Parallel.For(0, 10000000, i =>
                {
                    j++;
                });
            Console.WriteLine(j);
            Console.ReadKey();
        }
    } 
Run Code Online (Sandbox Code Playgroud)

每次我运行上面的程序时,它会在0到10000000之间写入不同的j值.我猜它不会等待所有迭代完成.它传递到下一行.我该怎么解决这个问题?任何帮助将不胜感激.谢谢.

版本:Interlocked.Increment(ref j); 子句解决了意外的结果,但是当我与正常循环比较时,此操作会导致大约10倍的时间.

gra*_*ish 5

你可以使用Interlocked.Increment(int32)最简单的方法.

使用Parallel.For将创建多个线程,这些线程将执行相同的lambda表达式; 在这种情况下,它所做的一切都是j++.

j++将被编译为类似的东西j = j + 1,这是一个读写操作.这可能会导致不必要的行为

这么说j = 50.

线程1正在执行读取,j++其中将获得50并将其添加1.在该线程完成对j另一个线程的写操作之前,执行读取操作并j从那时读取50,第一个线程已经完成了写入操作,j使其成为51但是第二个线程仍然在内存中有50作为值,j并且将添加1到那又一次写回51 j.

使用Interlocked该类可确保每个操作都以原子方式进行.

  • 你可以解释为什么提问者的代码失败以及为什么他对"Parallel.For"的猜测是不正确的,这可能是最有用的 (3认同)