简单地将OpenMp并行转换为c#并行 我把这个C++(OpenMP)并行转换成C并行,但它表示:

简单地将OpenMp并行转换为c#并行 我把这个C++(OpenMP)并行转换成C并行,但它表示:,c#,c++,multithreading,parallel-processing,C#,C++,Multithreading,Parallel Processing,错误1并非所有代码路径都在lambda表达式中返回类型为的值 “System.Func” 这是我的密码: C++ void floyd_warshall(内螺纹){ int i,j,k; omp_集合_num_线程(NumOfThreads); 对于(k=0;k

错误1并非所有代码路径都在lambda表达式中返回类型为的值 “
System.Func

这是我的密码:

C++
void floyd_warshall(内螺纹){
int i,j,k;
omp_集合_num_线程(NumOfThreads);
对于(k=0;k
c#
void floyd_warshall(内螺纹)
{
int k;
流行音乐;
pOp.MaxDegreeOfParallelism=NumOfThreads;
对于(k=0;k0,(i,loop,j)=>
{//(i=0;i0);
}

您可以使用一个更简单的
并行重载。对于
方法,它不需要您的代理具有返回值

    var pOp = new ParallelOptions { MaxDegreeOfParallelism = NumOfThreads };

    for (int k = 0; k < n; ++k)
        Parallel.For(0, n, pOp, i =>
        {   //  for (i = 0; i < n; ++i)
            for (int j = 0; j < n; ++j)
                /* If i and j are different nodes and if
                    the paths between i and k and between
                    k and j exist, do */
                if ((dist[i, k] * dist[k, j] != 0) && (i != j))
                    /* See if you can't get a shorter path
                        between i and j by interspacing
                        k somewhere along the current
                        path */
                    if ((dist[i, k] + dist[k, j] < dist[i, j]) || (dist[i, j] == 0))
                        dist[i, j] = dist[i, k] + dist[k, j];
        });
var pOp=new ParallelOptions{maxdegreeofpparallelism=NumOfThreads};
对于(int k=0;k
{//(i=0;i
我遇到了与您相同的问题,并设法解决了它。事实证明,我们的代码使用Parallel.For做了非常类似的事情。你可以从这里看到我的解决方案。最大的区别似乎是您使用的线程本地存储是值类型(int),而我使用的是引用类型

第一个问题是您需要一个return语句。例如,在这一行之前:

}, (j) => 0);
}, (j) => 0);
添加如下内容:

return 0;
}, (j) => j = 0);
您可能需要做的第二件事是更换这一行:

}, (j) => 0);
}, (j) => 0);
比如:

return 0;
}, (j) => j = 0);

这是Parallel.For函数的第5个参数,在其工作完成后由每个线程调用。如果需要保持值不变,也可以通过执行类似于j=j的操作来执行no op。但是,这将生成一个自分配警告,您必须使用来禁用该警告。

j
是每个线程的私有变量,因为它是在匿名函数中声明的。如果你在外部方法的开头声明它(就像你在C++代码中那样),它就不会是私有的。