Namensräume
Varianten
Aktionen

std::stop_source

Von cppreference.com
< cpp‎ | thread
 
 
Bibliothek für nebenläufige Programmierung
Threads
(C++11)
(C++20)
this_thread Namespace
(C++11)
(C++11)
(C++11)
Kooperatives Beenden
(C++20)
stop_source
(C++20)
Gegenseitiger Ausschluss
(C++11)
Allgemeines Sperrungsmanagement
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Bedingungsvariablen
(C++11)
Semaphoren
Latches und Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
(C++11)
Sichere Wiederherstellung
(C++26)
Hazard Pointer
Atomare Typen
(C++11)
(C++20)
Initialisierung von atomaren Typen
(C++11)(veraltet in C++20)
(C++11)(veraltet in C++20)
Speicherordnung
(C++11)(deprecated in C++26)
Freie Funktionen für atomare Operationen
Freie Funktionen für atomare Flags
 
 
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) [bearbeiten]
destruiert das stop_source-Objekt
(public member function) [bearbeiten]
weist das stop_source-Objekt zu
(public member function) [bearbeiten]
Modifizierer
stellt eine Stoppanforderung für den zugehörigen Stoppzustand, falls vorhanden
(public member function) [bearbeiten]
tauscht zwei stop_source-Objekte
(public member function) [bearbeiten]
Observer
gibt ein stop_token für den zugehörigen Stoppzustand zurück
(public member function) [bearbeiten]
prüft, ob der zugehörige Stoppzustand aufgefordert wurde zu stoppen
(public member function) [bearbeiten]
prüft, ob der zugehörige Stoppzustand gestoppt werden kann
(public member function) [bearbeiten]

[bearbeiten] Nicht-Memberfunktionen

vergleicht zwei std::stop_source-Objekte
(function) [bearbeiten]
spezialisiert den Algorithmus std::swap
(function) [bearbeiten]

[bearbeiten] Hilfstags

ein Tag, der für stop_source verwendet wird, um beim Konstruieren keinen zugehörigen Stoppzustand anzugeben
(tag)[bearbeiten]

[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