Espacios de nombres
Variantes
Acciones

std::jthread::request_stop

De cppreference.com
< cpp‎ | thread‎ | jthread
 
 
Biblioteca de apoyo de concurrencia
Hilos
(C++11)
(C++20)
Espacio de nombres this_thread
(C++11)
(C++11)
(C++11)
Cancelación cooperativa
Exclusión mutua
Gestión genérica de bloqueo
(C++11)
(C++11)
(C++11)
(C++11)
Variables de condición
(C++11)
Semáforos
Pestillos y barreras
(C++20)
(C++20)
Futuros
(C++11)
(C++11)
(C++11)
Recuperación segura
Punteros de riesgo
Tipos atómicos
(C++11)
(C++20)
Inicialización de tipos atómicos
(C++11)(en desuso en C++20)
(C++11)(en desuso en C++20)
Orden de memoria
Funciones independientes para operaciones atómicas
Funciones independientes para indicadores atómicos
 
 
bool request_stop()noexcept;
(desde C++20)

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

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

  • stop_requested() y stop_possible() pueden invocarse concurrentemente en otros objetos std::stop_tokens y std::stop_sources del mismo estado de detención compartido;
  • request_stop() puede invocarse concurrentemente desde varios hilos en el mismo objeto jthread u en otros objetos std::stop_source asociados con el mismo estado de detención, y solo uno realmente realizará la solicitud de detención.

Sin embargo, véase la sección de Notas.

Contenido

[editar]Parámetros

(Ninguno)

[editar]Valor de retorno

true si esta invocación hizo una solicitud de detención; de lo contrairo, false.

[editar]Poscondiciones

Para un objeto std::stop_token recuperado por get_stop_token() o un objeto std::stop_source recuperado por get_stop_source(), stop_requested() es true.

[editar]Notas

Si la llamada a request_stop() emite una solicitud de detención (es decir, devuelve true), cualquier devolución de llamada de detención (std::stop_callbacks) registrada para el mismo estado de detención asociado se invocará sincrónicamente en el mismo hilo en el que se emita request_stop(). Si una invocación de una devolución de llamada regresa a través de una excepción, se llama a std::terminate.

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

Si la llamada a request_stop() emite una solicitud de detención (es decir, devuelve true), entonces todas las variables de condición de tipo base std::condition_variable_any registradas con una espera interrumpible para los objetos std::stop_token asociados con el estado interno de detención del jthread se activarán.

[editar]Ejemplo

#include <iostream>#include <thread>#include <chrono>#include <mutex>#include <condition_variable>   usingnamespace std::chrono_literals;   int main(){// Un hilo obrero dormilónstd::jthread sleepy_worker([](std::stop_token stoken){for(int i=0; i <10; i++){std::this_thread::sleep_for(300ms);if(stoken.stop_requested()){std::cout<<"Se le solicita al hilo obrero dormilón que se detenga\n";return;}std::cout<<"Hilo obrero dormilón se regresa a dormir\n";}});   // Un hilo obrero en espera// La variable de condición se despertará por la solicitud de detención.std::jthread waiting_worker([](std::stop_token stoken){std::mutex mutex;std::unique_lock lock(mutex);std::condition_variable_any().wait(lock, stoken, [&stoken]{returnfalse;});if(stoken.stop_requested()){std::cout<<"Se le pide al hilo obrero en espera que se detenga"<<"\n";return;}});   // std::jthread::request_stop() puede llamarse explícitamente:std::cout<<"Solicitando al hilo obrero dormilón que se detenga\n"; sleepy_worker.request_stop(); sleepy_worker.join();std::cout<<"Unido al hilo obrero dormilón\n";   // O automáticamente usando RAII:// el destructor de waiting_worker llamará a request_stop()// y se unirá al hilo automáticamente.}

Posible salida:

Solicitando al hilo obrero dormilón que se detenga Se le solicita al hilo obrero dormilón que se detenga Unido al hilo obrero dormilón Se le pide al hilo obrero en espera que se detenga
close