Wie würde ich auf das Beenden mehrerer Threads warten?

8

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.

    
akshaykarthik 05.09.2010, 14:32
quelle

5 Antworten

11

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:

Datenparallelität (Task Parallel Library)

    
Lasse Espeholt 05.09.2010, 14:36
quelle
4

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: Ссылка .

    
Chris Laplante 05.09.2010 14:35
quelle
2

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:

%Vor%

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?

    
Ondrej Tucny 05.09.2010 14:42
quelle
2
  

und mehrere Joins beeinträchtigen die Leistung   so.

Es gibt keine "Leistungseinbußen". Wenn Sie warten möchten, bis alle Ihre Threads beendet sind, rufen Sie .join () für die Threads auf.

Füllen Sie Ihre Themen in einer Liste aus und machen Sie

%Vor%     
nos 05.09.2010 14:44
quelle
1

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

    
Steve Townsend 05.09.2010 14:36
quelle

Tags und Links