std::jthread:: request_stop
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Observers | ||||
| Operations | ||||
| Stop token handling | ||||
|
jthread::request_stop
|
||||
| Non-member functions | ||||
|
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
jthreado 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