std:: stop_callback
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Deduction guides |
|
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