相关疑难解决方法(0)

在parallel.foreach范围之外增加计数值

如何在parallel.foreach循环范围之外增加一个整数值?什么是同步访问并行循环外的对象的最轻的方法?

var count = 0;
Parallel.ForEach(collection, item =>
{
  action(item);
  // increment count??
}
Run Code Online (Sandbox Code Playgroud)

c# parallel-processing synchronization locking

18
推荐指数
4
解决办法
2万
查看次数

并行问题

我已经编写了3种不同的计算整数数组之和的方法,但是,我得到了第三种方法的不同结果.

初始化:

        int n = 100;
        int[] mArray = new int[n];
        for (int i = 0; i < mArray.Length; i++)          
            mArray[i] = 1;
Run Code Online (Sandbox Code Playgroud)

第一:

        int sum1 = mArray.Sum();
        Console.WriteLine("sum1 " + sum1);
Run Code Online (Sandbox Code Playgroud)

第二:

        int sum2 = 0;
        for (int i = 0; i < mArray.Length; i++)
            sum2 += mArray[i];
        Console.WriteLine("sum2 " + sum2);
Run Code Online (Sandbox Code Playgroud)

第三:

        int sum3 = 0;
        Parallel.ForEach(mArray, item =>
        {
            sum3 += item;
        });
        Console.WriteLine("sum3 " + sum3);
Run Code Online (Sandbox Code Playgroud)

显然,3种方法给出了如下所示的相同输出:

然而,当n增加(例如,n = 30000)时,第三种方法给出了令人惊讶的错误结果

注意:我使用ConcurrentBag测试了这些方法,这是一个线程安全的集合.我想,没有溢出问题.代码在Windows 10 x64计算机(Intel核心I-7 @ 3.30ghz)上进行测试

理解为什么Parallel.For的行为不同会很有趣.

c# multithreading parallel.foreach

0
推荐指数
1
解决办法
66
查看次数