In diesem Beispiel ist dies die korrekte Verwendung der Parallel.For
Schleife, wenn ich die Anzahl der Threads, die die Funktion DoWork
auf zehn gleichzeitig ausführen können, begrenzen möchte? Werden andere Threads blockiert, bis einer der zehn Threads verfügbar wird? Wenn nicht, was ist eine bessere multi-threaded Lösung, die mich diese Funktion noch 6000+ mal ausführen lassen würde?Korrekte Verwendung von Parallel für Schleife in C#?
class Program
{
static void Main(string[] args)
{
ThreadExample ex = new ThreadExample();
}
}
public class ThreadExample
{
int limit = 6411;
public ThreadExample()
{
Console.WriteLine("Starting threads...");
int temp = 0;
Parallel.For(temp, limit, new ParallelOptions { MaxDegreeOfParallelism = 10 }, i =>
{
DoWork(temp);
temp++;
});
}
public void DoWork(int info)
{
//Thread.Sleep(50); //doing some work here.
int num = info * 5;
Console.WriteLine("Thread: {0} Result: {1}", info.ToString(), num.ToString());
}
}
'temp ++' ist nicht Thread-sicher. – SLaks
@SLaks Ja, es ist nicht Thread sicher, aber hat es Bedeutung in diesem Wettbewerb? Wie funktioniert Parallel.Für? –
@HamletHakobyan Was meinst du? Die Absicht des Programmierers ist klar; Er möchte die Anzahl der erledigten Aufgaben zählen. Was tatsächlich passiert, ist aufgrund der Rennbedingungen, die möglicherweise dazu führen, dass der Zähler nicht richtig inkrementiert wird, nicht dasselbe. Die Verwendung von "interlocked.Exchange" würde das lösen. Wie bei 'Parallel.For' handelt es sich um eine For-Schleife, bei der die Iterationen (zu einem bestimmten Grad) von mehreren Threads parallel ausgeführt werden. – Servy