我想为单元格运行 Polygonise 并行方法(它们是独立的)。 如果在循环中初始化单元格,如何为单元格创建线程?
for (int j = 0; j < RowCount - 1; j++)
{
for (int k = 0; k < ColumnCount - 1; k++)
{
GridCell currentCell = GetCurrentCell (Slice1, Slice2, j, k);
Polygonise (ref Triangles, int isoLevel, GridCell currentCell);
}
}
ADDED :我希望将其传递给GPU,因此Parallel.For和PLinq不合适。问题是:它执行了很长时间,因为 Poligonise 方法中有许多计算,并且有许多行和列(循环参数)。该方法中的操作几乎是快速的,但是这样的循环是耗时的。我需要多线程逻辑。
答案 0 :(得分:4)
您可以尝试Parallel
s:
Parallel.For(0, RowCount, (j) =>
{
for (int k = 0; k < ColumnCount - 1; k++)
{
GridCell currentCell = GetCurrentCell (Slice1, Slice2, j, k);
// Beware! Possible race condition:
// "ref Triangles" is shared reference between threads.
Polygonise (ref Triangles, int isoLevel, GridCell currentCell);
}
});
或 PLinq (Parallel Linq):
Enumerable
.Range(0, RowCount)
.AsParallel()
// .WithDegreeOfParallelism(4) // <- if you want to tune PLinq
.ForAll(j => {
for (int k = 0; k < ColumnCount - 1; k++)
{
GridCell currentCell = GetCurrentCell (Slice1, Slice2, j, k);
// Beware! Possible race condition:
// "ref Triangles" is shared reference between threads.
Polygonise (ref Triangles, int isoLevel, GridCell currentCell);
}
});
在这两种情况下,请考虑哪些应并行Columns
或Rows
答案 1 :(得分:0)
直接的答案是在需要的地方创建它们并在那里启动它们:
for (int j = 0; j < RowCount - 1; j++)
{
for (int k = 0; k < ColumnCount - 1; k++)
{
GridCell currentCell = GetCurrentCell (Slice1, Slice2, j, k);
System.Threading.Thread t = new System.Threading.Thread(()=>
Polygonise (ref Triangles, isoLevel, currentCell));
t.Start();
}
}
免责声明:我不知道Triangles
是什么以及如何在您的方法中更改它,因此允许许多线程以无序方式更改同一变量可能并不明智。 / p>