Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 导致奇怪结果的并行代码_C#_Parallel Processing - Fatal编程技术网

C# 导致奇怪结果的并行代码

C# 导致奇怪结果的并行代码,c#,parallel-processing,C#,Parallel Processing,这是我第一次尝试并行代码(第一次尝试效果很好,并加速了一些代码),但下面的内容会引起奇怪的问题,我不明白为什么。下面的两个for循环在大多数情况下给出相同的结果,但不是所有情况下都给出相同的结果,即res!=res1。IdealGasEnthalpy函数只是计算一个数字,不改变任何其他东西,我不知道问题是什么,甚至不知道从哪里开始查找,有人有什么建议吗 double res = 0; object lockObject = new object();

这是我第一次尝试并行代码(第一次尝试效果很好,并加速了一些代码),但下面的内容会引起奇怪的问题,我不明白为什么。下面的两个for循环在大多数情况下给出相同的结果,但不是所有情况下都给出相同的结果,即res!=res1。IdealGasEnthalpy函数只是计算一个数字,不改变任何其他东西,我不知道问题是什么,甚至不知道从哪里开始查找,有人有什么建议吗

        double res = 0;
        object lockObject = new object();

        for (int I = 0; I < cc.Count; I++)
        {
            res += IdealGasEnthalpy(T, cc[I], enumMassOrMolar.Molar) * x[I];
        }

        double res1 = 0;

        Parallel.For(0, cc.Count, I =>
        {
            res1 += IdealGasEnthalpy(T, cc[I], enumMassOrMolar.Molar) * x[I];
        });
在下面也尝试过这个,在这个例程中坚持使用非并行,因为并行版本都要慢很多

        double res = 0.0d;
        double[] partialresult = new double[cc.Count];

        Parallel.For(0, cc.Count, i =>
            {
                partialresult[i] = IdealGasEnthalpy(T, cc[i], enumMassOrMolar.Molar) * X[i];
            });

        for (int i = 0; i < cc.Count; i++)
        {
            res += partialresult[i];
        }*
double res=0.0d;
double[]partialresult=新的双精度[cc.Count];
Parallel.For(0,cc.Count,i=>
{
部分结果[i]=IdealGasEnthalpy(T,cc[i],枚举质量摩尔数)*X[i];
});
对于(int i=0;i
您的第二个操作需要执行联锁添加,因为+=不是原子的。记住,这是读取变量、添加变量和存储结果的简写。存在一种竞争条件,即在任何一方存储新结果之前,可能会对相同的旧值进行两次读取。您需要同步访问

请注意,根据函数的计算开销,使用
Parallel.For
方法可能比只使用串行方法慢。它归结为计算值所花费的时间与同步和求和所花费的时间


或者,您可以将结果存储在预先分配的数组中,然后在所有并行操作完成后进行求和。这样,就不会有两个操作修改同一个变量。阵列以内存换取速度,因为您消除了同步带来的开销。

函数IdealGasEnthalpy的作用是什么?你能展示代码吗?因为@Matt,IdealGasEnthalpy做什么根本不重要。。。这是最基本的比赛条件的例子。。。。OP可以使用
res1++
(如果他们愿意提供)。@AlexeiLevenkov,谢谢你指出这一点!Quantic,以前提供的解决方案不适用于双打。
        double res = 0.0d;
        double[] partialresult = new double[cc.Count];

        Parallel.For(0, cc.Count, i =>
            {
                partialresult[i] = IdealGasEnthalpy(T, cc[i], enumMassOrMolar.Molar) * X[i];
            });

        for (int i = 0; i < cc.Count; i++)
        {
            res += partialresult[i];
        }*