无限并行 while 循环
Infinite parallel while loop
我需要在 C# 中并行调用相同的方法 (MaxDegreeOfParallelism = Environment.ProcessorCount
)。该方法 returns 一个数字序列。如果此序列满足某些条件 - 我需要执行以下操作
- 停止所有线程
- Return序列
- Return方法一共被调用了多少次
我有以下代码 - 但我在弄清楚要在我写的 GetValidSequenze
方法中写什么时遇到一些问题://WHAT TO DO HERE??
有什么想法吗?我做错了什么吗?
public class Example3
{
public delegate int Randomizer(int minValue, int maxValue);
private Randomizer rand;
public Example3(Randomizer randomizer)
{
rand = randomizer;
}
private IEnumerable<bool> Infinite()
{
while (true)
{
yield return true;
}
}
public int[][] GetValidSequenze(int minValue, int maxValue, int rows,
int columns, int sn, ref int counter)
{
ParallelOptions op = new ParallelOptions();
op.MaxDegreeOfParallelism = Environment.ProcessorCount;
int[][] result;
Parallel.ForEach(Infinite(), parallelOptions: op //WHAT TO DO HERE?? =>
{
int[][] tempRes;
while (!(tempRes = GetSequenze(minValue, maxValue, rows, columns))
.All(o => o.Contains(sn)))
{
Interlocked.Increment(ref counter);
}
loopState.Stop();
result = tempRes;
});
return result;
}
public int[][] GetSequenze(int minValue, int maxValue, int rows, int columns)
{
int[][] lot = new int[rows][];
for (int i = 0; i < rows; i++)
{
int[] column = new int[columns];
for (int j = 0; j < columns; j++)
{
while (true)
{
int tempNo = rand(0, 40);
if (!column.Contains(tempNo))
{
column[j] = tempNo;
break;
}
}
}
lot[i] = column;
}
return lot;
}
}
您的代码无法编译。以下是编译的 GetValidSequenze
方法的版本:
public int[][] GetValidSequenze(int minValue, int maxValue, int rows,
int columns, int sn, ref int counter)
{
int localCounter = counter;
ParallelOptions op = new ParallelOptions();
op.MaxDegreeOfParallelism = Environment.ProcessorCount;
int[][] result = default;
Parallel.ForEach(Infinite(), parallelOptions: op, (_, loopState) =>
{
int[][] tempRes;
while (!(tempRes = GetSequenze(minValue, maxValue, rows, columns))
.All(o => o.Contains(sn)))
{
Interlocked.Increment(ref localCounter);
}
loopState.Stop();
result = tempRes;
});
counter = localCounter;
return result;
}
有可能无论您想做什么,都可以通过改进算法比通过并行化可能效率低下的算法更有效地完成。
定义您计划在满足条件时设置的变量。
bool criteriaMet = false;
遇到就设置。
修改您的枚举器:
private IEnumerable<bool> Infinite()
{
while (!criteriaMet)
{
yield return true;
}
}
如果您发现 Infinite()
方法没有检测到 criteriaMet
中的任何变化,这可能是由于编译器优化所致。如果是这种情况,您可能需要使用 volatile keyword, or (better) use a CancellationToken 而不是 bool
.
我需要在 C# 中并行调用相同的方法 (MaxDegreeOfParallelism = Environment.ProcessorCount
)。该方法 returns 一个数字序列。如果此序列满足某些条件 - 我需要执行以下操作
- 停止所有线程
- Return序列
- Return方法一共被调用了多少次
我有以下代码 - 但我在弄清楚要在我写的 GetValidSequenze
方法中写什么时遇到一些问题://WHAT TO DO HERE??
有什么想法吗?我做错了什么吗?
public class Example3
{
public delegate int Randomizer(int minValue, int maxValue);
private Randomizer rand;
public Example3(Randomizer randomizer)
{
rand = randomizer;
}
private IEnumerable<bool> Infinite()
{
while (true)
{
yield return true;
}
}
public int[][] GetValidSequenze(int minValue, int maxValue, int rows,
int columns, int sn, ref int counter)
{
ParallelOptions op = new ParallelOptions();
op.MaxDegreeOfParallelism = Environment.ProcessorCount;
int[][] result;
Parallel.ForEach(Infinite(), parallelOptions: op //WHAT TO DO HERE?? =>
{
int[][] tempRes;
while (!(tempRes = GetSequenze(minValue, maxValue, rows, columns))
.All(o => o.Contains(sn)))
{
Interlocked.Increment(ref counter);
}
loopState.Stop();
result = tempRes;
});
return result;
}
public int[][] GetSequenze(int minValue, int maxValue, int rows, int columns)
{
int[][] lot = new int[rows][];
for (int i = 0; i < rows; i++)
{
int[] column = new int[columns];
for (int j = 0; j < columns; j++)
{
while (true)
{
int tempNo = rand(0, 40);
if (!column.Contains(tempNo))
{
column[j] = tempNo;
break;
}
}
}
lot[i] = column;
}
return lot;
}
}
您的代码无法编译。以下是编译的 GetValidSequenze
方法的版本:
public int[][] GetValidSequenze(int minValue, int maxValue, int rows,
int columns, int sn, ref int counter)
{
int localCounter = counter;
ParallelOptions op = new ParallelOptions();
op.MaxDegreeOfParallelism = Environment.ProcessorCount;
int[][] result = default;
Parallel.ForEach(Infinite(), parallelOptions: op, (_, loopState) =>
{
int[][] tempRes;
while (!(tempRes = GetSequenze(minValue, maxValue, rows, columns))
.All(o => o.Contains(sn)))
{
Interlocked.Increment(ref localCounter);
}
loopState.Stop();
result = tempRes;
});
counter = localCounter;
return result;
}
有可能无论您想做什么,都可以通过改进算法比通过并行化可能效率低下的算法更有效地完成。
定义您计划在满足条件时设置的变量。
bool criteriaMet = false;
遇到就设置。
修改您的枚举器:
private IEnumerable<bool> Infinite()
{
while (!criteriaMet)
{
yield return true;
}
}
如果您发现 Infinite()
方法没有检测到 criteriaMet
中的任何变化,这可能是由于编译器优化所致。如果是这种情况,您可能需要使用 volatile keyword, or (better) use a CancellationToken 而不是 bool
.