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 ;
(desde C++20)

Emite una solicitud de parada al estado de parada interno, si aún no se ha solicitado la parada previamente.

La determinación se realiza de manera atómica, y si se solicitó la detención, el estado de parada se actualiza atómicamente para evitar condiciones de carrera, de modo que:

  • stop_requested ( ) y stop_possible ( ) pueden ser invocados concurrentemente en otros std::stop_token s y std::stop_source s del mismo estado de parada compartido.
  • request_stop ( ) puede ser invocado concurrentemente desde múltiples hilos en el mismo objeto jthread o en otros objetos std::stop_source asociados con el mismo estado de parada, y solo uno realizará realmente la solicitud de parada.

Sin embargo, consulte la sección de Notas.

Contenidos

Parámetros

(ninguno)

Valor de retorno

true si esta invocación realizó una solicitud de parada, de lo contrario false .

Postcondiciones

Para un std::stop_token obtenido mediante get_stop_token ( ) o un std::stop_source obtenido mediante get_stop_source ( ) , stop_requested ( ) es true .

Notas

Si el request_stop ( ) emite una solicitud de parada (es decir, retorna true ), entonces cualquier std::stop_callbacks registrado para el mismo estado de parada asociado será invocado sincrónicamente, en el mismo hilo donde request_stop ( ) es emitido. Si una invocación de un callback finaliza mediante una excepción, std::terminate es llamado.

Si ya se ha realizado una solicitud de parada, esta función devuelve false . Sin embargo, no hay garantía de que otro hilo u std::stop_source objeto que acaba de solicitar (exitosamente) la parada para el mismo estado de parada no esté todavía en medio de invocar una std::stop_callback función.

Si la request_stop ( ) emite una solicitud de parada (es decir, devuelve true ), entonces todas las variables de condición de tipo base std::condition_variable_any registradas con una espera interrumpible para std::stop_token s asociados con el estado de parada interno del jthread serán despertadas.

Ejemplo

#include <chrono>
#include <condition_variable>
#include <iostream>
#include <mutex>
#include <thread>
using namespace std::chrono_literals;
// Función auxiliar para mostrar rápidamente qué hilo imprimió qué
void print(auto txt)
{
    std::cout << std::this_thread::get_id() << ' ' << txt;
}
int main()
{
    // Un hilo trabajador somnoliento
    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");
            }
        });
    // Un hilo trabajador en espera
    // La variable de condición será despertada por la solicitud de parada.
    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;
        });
    // Dormir este hilo para dar tiempo a los hilos para ejecutarse
    std::this_thread::sleep_for(400ms);
    // std::jthread::request_stop() puede llamarse explícitamente:
    print("Requesting stop of sleepy worker\n");
    sleepy_worker.request_stop();
    sleepy_worker.join();
    print("Sleepy worker joined\n");
    // O automáticamente usando RAII:
    // El destructor de waiting_worker llamará a request_stop()
    // y unirá el hilo automáticamente.
}

Salida posible:

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