std::stop_source
| Definiert in Header <stop_token> |
||
| class stop_source; |
(seit C++20) | |
Die Klasse stop_source bietet die Mittel zur Ausstellung einer Stoppanforderung, wie z. B. für die std::jthread-Abbrechung. Eine für ein stop_source-Objekt gestellte Stoppanforderung ist für alle stop_sources und std::stop_tokens desselben zugehörigen Stoppzustands sichtbar; alle für zugehörige std::stop_tokens registrierten std::stop_callback(s) werden aufgerufen, und alle std::condition_variable_any-Objekte, die auf zugehörigen std::stop_tokens warten, werden geweckt.
Sobald ein Stopp angefordert wurde, kann er nicht mehr zurückgezogen werden. Zusätzliche Stoppanforderungen haben keine Auswirkung.
Inhalt |
[bearbeiten] Memberfunktionen
konstruiert ein neues stop_source-Objekt(public member function) | |
destruiert das stop_source-Objekt(public member function) | |
weist das stop_source-Objekt zu(public member function) | |
Modifizierer | |
| stellt eine Stoppanforderung für den zugehörigen Stoppzustand, falls vorhanden (public member function) | |
tauscht zwei stop_source-Objekte(public member function) | |
Observer | |
gibt ein stop_token für den zugehörigen Stoppzustand zurück(public member function) | |
| prüft, ob der zugehörige Stoppzustand aufgefordert wurde zu stoppen (public member function) | |
| prüft, ob der zugehörige Stoppzustand gestoppt werden kann (public member function) | |
[bearbeiten] Nicht-Memberfunktionen
| (C++20) |
vergleicht zwei std::stop_source-Objekte(function) |
| (C++20) |
spezialisiert den Algorithmus std::swap (function) |
[bearbeiten] Hilfstags
| (C++20) |
ein Tag, der für stop_source verwendet wird, um beim Konstruieren keinen zugehörigen Stoppzustand anzugeben(tag) |
[bearbeiten] Anmerkungen
Für die Zwecke der std::jthread-Abbrechung sollte das stop_source-Objekt aus dem std::jthread-Objekt über get_stop_source() abgerufen werden; oder der Stopp sollte direkt vom std::jthread-Objekt über request_stop() angefordert werden. Dies verwendet dann denselben zugehörigen Stoppzustand wie derjenige, der an das Funktionsargument von std::jthread übergeben wurde (d. h. die Funktion, die auf seinem Thread ausgeführt wird).
Für andere Verwendungszwecke kann jedoch ein stop_source separat mit dem Standardkonstruktor konstruiert werden, der einen neuen Stoppzustand erstellt.
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_jthread |
201911L |
(C++20) | Stop-Token und verbindender Thread |
[bearbeiten] Beispiel
#include <chrono> #include <iostream> #include <stop_token> #include <thread> using namespace std::chrono_literals; void worker_fun(int id, std::stop_token stoken) { for (int i = 10; i; --i) { std::this_thread::sleep_for(300ms); if (stoken.stop_requested()) { std::printf(" worker%d is requested to stop\n", id); return; } std::printf(" worker%d goes back to sleep\n", id); } } int main() { std::jthread threads[4]; std::cout << std::boolalpha; auto print = [](const std::stop_source& source) { std::printf("stop_source stop_possible = %s, stop_requested = %s\n", source.stop_possible() ? "true" : "false", source.stop_requested() ? "true" : "false"); }; // Common source std::stop_source stop_source; print(stop_source); // Create worker threads for (int i = 0; i < 4; ++i) threads[i] = std::jthread(worker_fun, i + 1, stop_source.get_token()); std::this_thread::sleep_for(500ms); std::puts("Request stop"); stop_source.request_stop(); print(stop_source); // Note: destructor of jthreads will call join so no need for explicit calls }
Mögliche Ausgabe
stop_source stop_possible = true, stop_requested = false worker2 goes back to sleep worker3 goes back to sleep worker1 goes back to sleep worker4 goes back to sleep Request stop stop_source stop_possible = true, stop_requested = true worker3 is requested to stop worker1 is requested to stop worker2 is requested to stop worker4 is requested to stop