std::promise<R>:: set_value
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Getting the result | ||||
| Setting the result | ||||
|
promise::set_value
|
||||
| Non-member Functions | ||||
| Helper Classes | ||||
|
Haupttemplate
|
||
|
void
set_value
(
const
R
&
value
)
;
|
(1) | (seit C++11) |
|
void
set_value
(
R
&&
value
)
;
|
(2) | (seit C++11) |
|
std::
promise
<
R
&
>
Spezialisierungen
|
||
|
void
set_value
(
R
&
value
)
;
|
(3) | (seit C++11) |
|
std::
promise
<
void
>
Spezialisierung
|
||
|
void
set_value
(
)
;
|
(4) | (seit C++11) |
Die Operation verhält sich so, als ob
set_value
,
set_exception
,
set_value_at_thread_exit
und
set_exception_at_thread_exit
einen einzelnen Mutex assoziiert mit dem Promise-Objekt erwerben, während sie das Promise-Objekt aktualisieren.
Aufrufe dieser Funktion führen nicht zu Datenrennen mit Aufrufen von get_future (daher müssen sie nicht miteinander synchronisiert werden).
Inhaltsverzeichnis |
Parameter
| value | - | Wert, der im gemeinsamen Zustand gespeichert werden soll |
Rückgabewert
(keine)
Exceptions
std::future_error unter den folgenden Bedingungen:
- * this besitzt keinen gemeinsamen Zustand. Der Fehlercode wird auf no_state gesetzt.
- Der gemeinsame Zustand speichert bereits einen Wert oder eine Exception. Der Fehlercode wird auf promise_already_satisfied gesetzt.
Zusätzlich:
R
ausgewählt wurde.
R
zu verschieben.
Beispiel
Dieses Beispiel zeigt, wie std:: promise < void > als Signale zwischen Threads verwendet werden kann.
#include <algorithm> #include <cctype> #include <chrono> #include <future> #include <iostream> #include <iterator> #include <sstream> #include <thread> #include <vector> using namespace std::chrono_literals; int main() { std::istringstream iss_numbers{"3 4 1 42 23 -23 93 2 -289 93"}; std::istringstream iss_letters{" a 23 b,e a2 k k?a;si,ksa c"}; std::vector<int> numbers; std::vector<char> letters; std::promise<void> numbers_promise, letters_promise; auto numbers_ready = numbers_promise.get_future(); auto letter_ready = letters_promise.get_future(); std::thread value_reader([&] { // I/O-Operationen std::copy(std::istream_iterator<int>{iss_numbers}, std::istream_iterator<int>{}, std::back_inserter(numbers)); // Benachrichtigung für Zahlen numbers_promise.set_value(); std::copy_if(std::istreambuf_iterator<char>{iss_letters}, std::istreambuf_iterator<char>{}, std::back_inserter(letters), ::isalpha); // Benachrichtigung für Buchstaben letters_promise.set_value(); }); numbers_ready.wait(); std::sort(numbers.begin(), numbers.end()); if (letter_ready.wait_for(1s) == std::future_status::timeout) { // Zahlen ausgeben, während Buchstaben gelesen werden for (int num : numbers) std::cout << num << ' '; numbers.clear(); // Zahlen wurden bereits ausgegeben } letter_ready.wait(); std::sort(letters.begin(), letters.end()); // macht nichts, wenn Zahlen bereits ausgegeben wurden for (int num : numbers) std::cout << num << ' '; std::cout << '\n'; for (char let : letters) std::cout << let << ' '; std::cout << '\n'; value_reader.join(); }
Ausgabe:
-289 -23 1 2 3 4 23 42 93 93 a a a a b c e i k k k s s
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| LWG 2098 | C++11 |
Überladungen
(1,2)
konnten nur die
Ausnahmen werfen, die vom Kopier-/Verschiebe- Konstruktor von
R
geworfen werden
|
sie können die Ausnahmen werfen,
die vom tatsächlich ausgewählten Konstruktor zum Kopieren/Verschieben eines Objekts vom Typ
R
geworfen werden
|
Siehe auch
|
setzt das Ergebnis auf einen bestimmten Wert, liefert die Benachrichtigung jedoch erst beim Thread-Ende
(öffentliche Elementfunktion) |
|
|
setzt das Ergebnis, um eine Ausnahme anzuzeigen
(öffentliche Elementfunktion) |