Namespaces
Variants

std:: stop_callback

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
(C++20)
stop_callback
(C++20)
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
Definido en el encabezado <stop_token>
template < class Callback >
class stop_callback ;
(desde C++20)

La plantilla de clase stop_callback proporciona un tipo de objeto RAII que registra una función de callback para un std::stop_token asociado, de modo que la función de callback será invocada cuando la std::stop_source asociada del std::stop_token sea solicitada para detenerse.

Las funciones de callback registradas mediante el constructor de stop_callback se invocan ya sea en el mismo hilo que invoca exitosamente request_stop ( ) para un std::stop_source del std::stop_token asociado del stop_callback ; o si la parada ya fue solicitada antes del registro del constructor, entonces el callback se invoca en el hilo que construye el stop_callback .

Se pueden crear más de un stop_callback para el mismo std::stop_token , desde el mismo hilo o diferentes hilos concurrentemente. No se proporciona garantía alguna sobre el orden en que serán ejecutados, pero serán invocados sincrónicamente; excepto para los stop_callback (s) construidos después de que ya se haya solicitado la parada para el std::stop_token , como se describió anteriormente.

Si una invocación de un callback termina mediante una excepción entonces std::terminate es llamado.

std::stop_callback no es CopyConstructible , CopyAssignable , MoveConstructible , ni MoveAssignable .

El parámetro de plantilla Callback debe ser tanto invocable como destructible . Cualquier valor de retorno es ignorado.

Contenidos

Tipos de miembros

Tipo Definición
callback_type Callback

Funciones miembro

construye un nuevo objeto stop_callback
(función miembro pública)
destruye el objeto stop_callback
(función miembro pública)
operator=
[deleted]
stop_callback no es asignable
(función miembro pública)

Guías de deducción

Ejemplo

#include <chrono>
#include <condition_variable>
#include <iostream>
#include <mutex>
#include <sstream>
#include <thread>
using namespace std::chrono_literals;
// Use a helper class for atomic std::cout streaming.
class Writer
{
    std::ostringstream buffer;
public:
    ~Writer()
    {
        std::cout << buffer.str();
    }
    Writer& operator<<(auto input)
    {
        buffer << input;
        return *this;
    }
};
int main()
{
    // A worker thread.
    // It will wait until it is requested to stop.
    std::jthread worker([] (std::stop_token stoken)
    {
        Writer() << "Worker thread's id: " << std::this_thread::get_id() << '\n';
        std::mutex mutex;
        std::unique_lock lock(mutex);
        std::condition_variable_any().wait(lock, stoken,
            [&stoken] { return stoken.stop_requested(); });
    });
    // Register a stop callback on the worker thread.
    std::stop_callback callback(worker.get_stop_token(), []
    {
        Writer() << "Stop callback executed by thread: "
            << std::this_thread::get_id() << '\n';
    });
    // Stop_callback objects can be destroyed prematurely to prevent execution.
    {
        std::stop_callback scoped_callback(worker.get_stop_token(), []
        {
            // This will not be executed.
            Writer() << "Scoped stop callback executed by thread: "
                << std::this_thread::get_id() << '\n';
        });
    }
    // Demonstrate which thread executes the stop_callback and when.
    // Define a stopper function.
    auto stopper_func = [&worker]
    {
        if (worker.request_stop())
            Writer() << "Stop request executed by thread: "
                << std::this_thread::get_id() << '\n';
        else
            Writer() << "Stop request not executed by thread: "
                << std::this_thread::get_id() << '\n';
    };
    // Let multiple threads compete for stopping the worker thread.
    std::jthread stopper1(stopper_func);
    std::jthread stopper2(stopper_func);
    stopper1.join();
    stopper2.join();
    // After a stop has already been requested,
    // a new stop_callback executes immediately.
    Writer() << "Main thread: " << std::this_thread::get_id() << '\n';
    std::stop_callback callback_after_stop(worker.get_stop_token(), []
    {
        Writer() << "Stop callback executed by thread: "
            << std::this_thread::get_id() << '\n';
    });
}

Salida posible:

Worker thread's id: 140460265039616
Stop callback executed by thread: 140460256646912
Stop request executed by thread: 140460256646912
Stop request not executed by thread: 140460248254208
Main thread: 140460265043776
Stop callback executed by thread: 140460265043776