Hier ist ein Beispiel dafür, wie man die gleiche Wirkung erzielen kann mit std::thread
und std::future
, wenn Sie bereit sind, den Haupt-Thread schlafen zu lassen, während Polling die Bereitschaft der Fäden (alternativ Sie ein dedizierter Thread die Warte behandeln lassen konnte).
diese Funktion Betrachten wir eine Reihe von Iteratoren in einen Behälter mit std::future
nehmen, die bis zumindest eine Aufgabe beendet ist blockiert:
const int TIME_BETWEEN_POLLS_MS = 50;
// Wait (sleep) between polls until a task is finished then return iterator to future.
template <typename Iterator>
Iterator waitForFirst(Iterator first, Iterator last) {
auto it = first;
auto status = std::future_status::timeout;
while (status != std::future_status::ready) {
if (++it == last) { // Rotate in range.
it = first;
}
status = it->wait_for(std::chrono::milliseconds(TIME_BETWEEN_POLLS_MS));
}
return it;
}
Nun, wenn Sie einen Container von Futures (std::future
) haben Mit den Rückgabewerten Ihrer Aufgaben, die auf separaten Threads ausgeführt werden, können Sie einfach die Funktion waitForFirst
verwenden, um einen Iterator für die Zukunft zu erhalten, der sein Ergebnis zuerst erhält.
// Lets say you have a vector of futures, e.g.
std::vector<std::future<std::thread::id>> futures;
/* Push futures to vector... */
// Block until first task is finished.
// 'it' is iterator to future associated with result.
auto it = finishingThread(std::begin(futures), std::end(futures));
Siehe live example
Schauen Sie sich hier ein: http://stackoverflow.com/questions/10818254/learning-threads-on-linux – marcinj
@marcin_j diese Frage nicht nur informativ, es ist wohl ein Outright-Dupe von diesem (oder vielmehr es ist umgekehrt). Danke für die Verknüpfung. Und zum OP, nein, nicht nativ ohne etwas Arbeit von Ihrer Seite. Solch eine willkürliche Thread-Exit-Erkennung befindet sich nicht in der Thread-Support-Bibliothek, jedenfalls nicht, die ich je gesehen habe. – WhozCraig
Wenn Sie auf Windows sind und es nur mehr C++ ish behalten wollen, dann ist die [Concurrency Runtime] (http://msdn.microsoft.com/en-us/library/dd504870.aspx) eine gute Wahl. Microsofts "std :: thread" - und "std :: async" -Implementierung baut auf VS2013 auf. – Mgetz