Warum ist parallel? Für ist zwischen verschiedenen Aggregationsausführungen derselben Methode mit denselben Eingaben nicC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Warum ist parallel? Für ist zwischen verschiedenen Aggregationsausführungen derselben Methode mit denselben Eingaben nic

Post by Anonymous »

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();
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post