Namespaces
Variants

std::jthread:: request_stop

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
bool request_stop ( ) noexcept ;
(seit C++20)

Sendet eine Stoppanforderung an den internen Stoppzustand, falls noch keine Stoppanforderung gestellt wurde.

Die Entscheidung wird atomar getroffen, und falls ein Stopp angefordert wurde, wird der Stopp-Zustand atomar aktualisiert, um Wettlaufsituationen zu vermeiden, sodass:

  • stop_requested ( ) und stop_possible ( ) können gleichzeitig auf anderen std::stop_token s und std::stop_source s desselben gemeinsamen Stop-Zustands aufgerufen werden.
  • request_stop ( ) kann gleichzeitig von mehreren Threads auf demselben jthread -Objekt oder auf anderen std::stop_source -Objekten mit demselben Stop-Zustand aufgerufen werden, und nur einer wird tatsächlich die Stop-Anforderung ausführen.

Siehe jedoch den Abschnitt "Notes".

Inhaltsverzeichnis

Parameter

(keine)

Rückgabewert

true wenn dieser Aufruf eine Stoppanfrage ausgelöst hat, andernfalls false .

Nachbedingungen

Für einen std::stop_token , der durch get_stop_token ( ) abgerufen wird, oder eine std::stop_source , die durch get_stop_source ( ) abgerufen wird, ist stop_requested ( ) true .

Hinweise

Wenn die request_stop ( ) tatsächlich eine Stoppanforderung ausgibt (d.h. true zurückgibt), dann werden alle std::stop_callbacks , die für denselben assoziierten Stop-Zustand registriert sind, synchron auf demselben Thread aufgerufen, auf dem request_stop ( ) ausgeführt wird. Wenn ein Aufruf eines Callbacks durch eine Exception beendet wird, wird std::terminate aufgerufen.

Wenn bereits eine Stoppanforderung gestellt wurde, gibt diese Funktion false zurück. Es gibt jedoch keine Garantie, dass ein anderer Thread oder ein std::stop_source -Objekt, das gerade (erfolgreich) eine Stoppanforderung für denselben Stoppzustand gestellt hat, sich nicht noch mitten im Aufruf einer std::stop_callback -Funktion befindet.

Falls die request_stop ( ) tatsächlich eine Stoppanforderung ausgibt (d.h. true zurückgibt), dann werden alle Bedingungsvariablen des Basistyps std::condition_variable_any , die mit einem unterbrechbaren Wait für std::stop_token s registriert sind, die dem internen Stop-Zustand des jthread zugeordnet sind, aufgeweckt.

Beispiel

#include <chrono>
#include <condition_variable>
#include <iostream>
#include <mutex>
#include <thread>
using namespace std::chrono_literals;
// Hilfsfunktion zur schnellen Anzeige, welcher Thread was ausgegeben hat
void print(auto txt)
{
    std::cout << std::this_thread::get_id() << ' ' << txt;
}
int main()
{
    // Ein schläfriger Worker-Thread
    std::jthread sleepy_worker(
        [](std::stop_token stoken)
        {
            for (int i = 10; i; --i)
            {
                std::this_thread::sleep_for(300ms);
                if (stoken.stop_requested())
                {
                    print("Sleepy worker is requested to stop\n");
                    return;
                }
                print("Sleepy worker goes back to sleep\n");
            }
        });
    // Ein wartender Worker-Thread
    // Die Bedingungsvariable wird durch die Stop-Anforderung aufgeweckt.
    std::jthread waiting_worker(
        [](std::stop_token stoken)
        {
            std::mutex mutex;
            std::unique_lock lock(mutex);
            std::condition_variable_any().wait(lock, stoken, []{ return false; });
            print("Waiting worker is requested to stop\n");
            return;
        });
    // Diesen Thread schlafen legen, um den Threads Zeit zum Ausführen zu geben
    std::this_thread::sleep_for(400ms);
    // std::jthread::request_stop() kann explizit aufgerufen werden:
    print("Requesting stop of sleepy worker\n");
    sleepy_worker.request_stop();
    sleepy_worker.join();
    print("Sleepy worker joined\n");
    // Oder automatisch mittels RAII:
    // Der Destruktor von waiting_worker ruft request_stop() auf
    // und joined den Thread automatisch.
}

Mögliche Ausgabe:

140287602706176 Sleepy worker goes back to sleep
140287623300928 Requesting stop of sleepy worker
140287602706176 Sleepy worker is requested to stop
140287623300928 Sleepy worker joined
140287594313472 Waiting worker is requested to stop