Ich habe einen Haupt-Thread, der ungefähr 20 Worker-Threads hervorbringt.
Ich muss den Haupt-Thread stoppen, bis alle anderen Threads beendet sind.
Ich weiß über (thread) .Join. Aber das funktioniert nur für einen Thread.
und mehrere Joins schaden der Performance.
t1.Join ()
t2.Join ()
...
t20.Join ()
, da das Programm einzeln nacheinander wartet.
Wie würde ich das so machen? Der Haupt-Thread wartet auf das Ende aller Threads.
Sie sollten sich wirklich Task Parallelism (Task Parallel Library) anschauen. Es verwendet einen Thread-Pool, verwaltet aber auch Aufgabenstehlen usw.
Quote: " Die TPL skaliert den Grad der Parallelität dynamisch, um alle verfügbaren Prozessoren effizient zu nutzen. Darüber hinaus behandelt die TPL die Partitionierung der Arbeit, die Planung von Threads auf dem ThreadPool, die Unterstützung von Löschvorgängen , Statusverwaltung und andere Details auf niedriger Ebene. " Task Parallel Library
Sie können es wie folgt verwenden:
%Vor%Oder wenn Sie eine Art Schleife verwenden, um Ihre Threads zu erzeugen:
Die join
s sind in Ordnung, wenn Sie das wollen. Der Haupt-Thread muss immer noch auf die Beendigung aller Worker-Threads warten. Sehen Sie sich diese Website an, die ein Beispielkapitel von C# in a Nutshell
ist. Es ist einfach so, das Threading-Kapitel zu sein: Ссылка .
Ich kann keine offensichtlichen Leistungseinbußen sehen, wenn ich darauf warte, dass die Threads nacheinander beendet werden. Also, eine einfache foreach
macht, was Sie wollen, ohne unnötigen Schnickschnack:
Hinweis: Natürlich gibt es eine Win32-API-Funktion, die es erlaubt, auf mehrere Objekte (in diesem Fall Threads) gleichzeitig zu warten - WaitForMultipleObjectsEx
. Es gibt viele Hilfsklassen oder Threading-Frameworks im Internet, die es für das verwenden, was Sie wollen. Aber brauchen Sie sie wirklich für einen einfachen Fall?
Wenn Sie sicher sind, dass Sie immer & lt; 64 Threads, dann könnte jeder neue Thread zuverlässig ein Event setzen, bevor es beendet wird, und WaitAll auf die Events in Ihrem Haupt-Thread, sobald alle Threads gestartet sind. Das Ereignisobjekt wird im Hauptthread erstellt und zum Threaderstellungszeitpunkt threadsicher an den relevanten untergeordneten Thread übergeben.
In nativem Code können Sie das gleiche für die Thread-Handles selbst tun, aber nicht sicher, wie Sie dies in .Net tun können.
Siehe auch diese vorherige Frage: C #: Warten auf das Ende aller Threads
Tags und Links c# multithreading c#-4.0