std :: thread: Wie kann ich warten (beitreten), um einen der angegebenen Threads zu vervollständigen?

8

Zum Beispiel habe ich zwei Threads, t1 und t2 . Ich möchte warten bis t1 oder t2 fertig ist. Ist das möglich?

Wenn ich eine Reihe von Threads habe, sagen wir, std::vector<std::thread> , wie kann ich das tun?

    
t123yh 25.04.2017, 15:13
quelle

4 Antworten

3

Es gibt immer warten & amp; benachrichtigen mit std::condition_variable , zB :

%Vor%

Hinweis: val stellt nicht unbedingt den Thread dar, der zuerst fertig war, da alle Threads ungefähr zur selben Zeit fertig sind und ein Überschreiben migh auftritt, aber nur für die Zwecke dieses Beispiels.

    
Snps 25.04.2017, 17:17
quelle
2

Nein, es gibt keine Wartezeiten für mehrere Objekte, die in der C ++ 11-Threading-Bibliothek äquivalent sind.

Wenn Sie auf den ersten einer Reihe von Vorgängen warten möchten, ziehen Sie in Erwägung, dass sie eine thread-sichere Warteschlange für Erzeuger und Verbraucher bereitstellen.

Hier ist ein Beitrag, den ich mit einem threaded_queue<T> gemacht habe. Lassen Sie das Arbeitsprodukt Ihrer Threads an eine solche Warteschlange liefern. Lassen Sie den Verbraucher vom anderen Ende ablesen.

Jetzt kann jemand auf das Arbeitsprodukt mehrerer Threads gleichzeitig warten. Oder ein Thread. Oder ein GPU-Shader. Oder Arbeitsprodukt, das über eine REST-konforme Webschnittstelle geliefert wird. Es ist dir egal.

Die Threads selbst sollten von etwas wie einem Thread-Pool oder einer anderen Abstraktion höherer Ebene oberhalb von std::thread verwaltet werden, da std::thread eine schlechte Client-bezogene Threading-Abstraktion verursacht.

%Vor%

Ich würde std::optional anstelle von boost::optional in C ++ 17 verwenden. Es kann auch durch ein unique_ptr oder eine Anzahl anderer Konstrukte ersetzt werden.

    
Yakk 25.04.2017 15:23
quelle
1

Es ist einfach mit einem Abruf warten:

%Vor%

Beispielausgabe, die ich auf Ideone.com bekommen habe:

%Vor%

Dies ist wahrscheinlich nicht der bestmögliche Code, da Polling-Loops nicht unbedingt Best Practice sind, aber es sollte als Anfang funktionieren.

    
Xirema 25.04.2017 16:07
quelle
0

Es gibt keine Standardmethode, auf mehrere Threads zu warten.

Sie müssen auf betriebssystemspezifische Funktionen wie WaitForMultipleObjects unter Windows zurückgreifen. Ein Beispiel nur für Windows:

%Vor%

Komischerweise, wenn std::when_any standardisiert wird, kann man eine Standard aber verschwenderische Lösung machen:

%Vor%

sehr verschwenderisch, immer noch nicht verfügbar, aber Standard.

    
David Haim 25.04.2017 15:22
quelle

Tags und Links