So können Sie eine std::future
erstellen, die keine Arbeit tut, bis .get()
genannt wird:Kann ich ausführen, um mein `std :: future` zu erhalten und darauf zu warten?
auto f_deferred = std::async(std::launch::deferred, []{ std::cout << "I ran\n"; });
Sie können auch eine std::future
schreiben, wartbar ist, und kann in jedem Thread an einer beliebigen Stelle von Code bereit gestellt werden:
std::packaged_task<void()> p([](std::cout << "I also ran\n"; });
auto f_waitable = p.get_future();
Wenn Sie f_deferred.wait_for(1ms)
anrufen, wird es nicht warten warten. Wenn Sie f_deferred.get()
nennen, eine Lambda Ihrer Wahl (in diesem Fall eine, die "I ran\n"
ausführt druckt.
Wenn Sie f_waitable.get()
nennen, gibt es keine Möglichkeit für Code, um die Verwaltung von Aufgaben bewusst sein, dass jemand auf die Zukunft wartet. aber wenn Sie f_deferred.wait(1ms);
nennen, erhalten Sie einfach future_status::deferred
sofort.
gibt es eine Möglichkeit, diese beiden?
ein konkreter Anwendungsfall ist ein Thread-Pool kombinieren Rückkehr Futures, wenn die Menschen Aufgaben Warteschlange. wenn eine unqueued Zukunft .get()
Ich möchte den Thread verwenden, der blockiert ist, um die Aufgabe statt havin auszuführen g es im Leerlauf. Auf der anderen Seite möchte ich, dass Leute mit den zurückgegebenen Futures feststellen können, ob die Aufgabe beendet ist, und sogar eine begrenzte Zeit warten, bis die Aufgabe beendet ist. (in dem Fall, wo Sie warten, bin ich in Ordnung mit Ihrem Thread im Leerlauf während Ihres Wartens)
Scheitern, gibt es Lösungen in kommenden Vorschlägen, die dieses Problem besser als meine Thread-Pool-Rückkehr eine Zukunft mit lösen würde all seine Grenzen? Ich habe gehört, dass Futures keine Zukunft haben und bessere Lösungen für die Lösung von Problem-Futures existieren.
Sie sagen, dass Konsumenten-Threads Lage sein sollten, arbeiten vom Testamentsvollstrecker zu stehlen, wenn das bedeutet, dass sie schneller abgeschlossen werden kann? Ich denke, du musst dein eigenes schreiben. Der Standard würde niemals etwas so Nützliches bieten :) –
@richard Ja; Von Bedeutung ist auch nicht das Deadlocking, da alle Threads in meinem Pool auf Threads warten, die auf Slots warten, um ausgeführt zu werden. – Yakk
Ja, es ist nicht einfach. –