std::jthread::request_stop
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