Warum ist parallel? Für ist zwischen verschiedenen Aggregationsausführungen derselben Methode mit denselben Eingaben nic
Posted: 13 Feb 2025, 19:25
Ich habe kürzlich die C# parallel.for -Methode in Bezug auf Rennbedingungen und die gemeinsamen Nutzung staatlicher Probleme überprüft. Um diese Schleife zu testen, habe ich eine einfache C# -Konsole -Anwendung implementiert, die immer denselben Wert zurückgeben sollte (siehe Code -Snippet unten). Wenn es ausgeführt wird, gibt es jedoch unterschiedliche Werte zurück, insbesondere Arrays -Größen, was darauf hinweist .Für Spaltbereich zwischen "Threads" unterschiedlich, auch wenn sich zwischen den Läufen keine Werte ändern?
Code: Select all
using System.Collections.Concurrent;
var Ntests = 1000;
var repetitions = Enumerable.Range(0, Ntests).Select((rep) =>
{
var result = NewMethod(0,10);
return result;
}).ToArray();
bool shouldBreak = false;
for (int first = 0; !shouldBreak && first < repetitions.Length; first++)
{
for (int second = first+1; !shouldBreak && second < repetitions.Length; second++)
{
var rep = repetitions[first];
var rep2 = repetitions[second];
if (!Enumerable.SequenceEqual(rep.OrderBy(x=>x), rep2.OrderBy(x=>x)))
{
Console.WriteLine("Routine not consistent");
Console.WriteLine($"rep[{first}]:{string.Join(',', rep)}");
Console.WriteLine($"rep[{second}]:{string.Join(',', rep2)}");
shouldBreak = true;
}
}
}
static List NewMethod(int init, int final)
{
var result = new ConcurrentBag();
Action agregate = (value) => result.Add(value);
Func inicializador = () => 0;
Func body =
(i, state, threadAcum) => threadAcum += i;
Parallel.For(init,
final,
inicializador,
body,
agregate);
return result.ToList();
}