std::jthread::request_stop
bool request_stop() noexcept; | (since C++20) |
Выполняет запрос остановки внутреннего состояния остановки, если запрос остановки еще не был выполнен.
Определение выполняется атомарно, и если запрос остановки был выполнен, состояние остановки атомарно обновляется, чтобы избежать гонок, таким образом:
-
stop_requested()иstop_possible()могут быть одновременно вызваны на другихstd::stop_tokenиstd::stop_sourceс тем же общим состоянием остановки. -
request_stop()может быть одновременно вызван из нескольких потоков на одном объектеjthreadили на других объектахstd::stop_source, связанных с тем же состоянием остановки, и только один фактически выполнит запрос остановки.
Однако см. раздел Примечания.
Параметры
(нет)
Возвращаемое значение
true , если этот вызов выполнил запрос остановки, иначе false.
Последующие условия
Для std::stop_token , полученного с помощью get_stop_token() или std::stop_source , полученного с помощью get_stop_source(), stop_requested() равно true.
Примечания
Если request_stop() выполняет запрос остановки (т. е., возвращает true), то любой std::stop_callbacks, зарегистрированный для того же связанного состояния остановки, будет вызван синхронно в том же потоке, в котором был выдан request_stop(). Если вызов обратного вызова завершается с исключением, вызывается std::terminate.
Если запрос остановки уже был выполнен, эта функция возвращает false. Однако нет гарантии, что другой поток или объект std::stop_source, который только что (успешно) запросил остановку для того же состояния остановки, еще не находится в середине вызова функции std::stop_callback.
Если request_stop() выполняет запрос остановки (т. е., возвращает true), все переменные условия базового типа std::condition_variable_any , зарегистрированные с прерываемым ожиданием std::stop_token , связанные с внутренним состоянием остановки jthread , будут разбужены.
Пример
#include <chrono>
#include <condition_variable>
#include <iostream>
#include <mutex>
#include <thread>
using namespace std::chrono_literals;
int main()
{
// A sleepy worker thread
std::jthread sleepy_worker([](std::stop_token stoken)
{
for (int i = 10; i; --i)
{
std::this_thread::sleep_for(300ms);
if (stoken.stop_requested())
{
std::cout << "Sleepy worker is requested to stop\n";
return;
}
std::cout << "Sleepy worker goes back to sleep\n";
}
});
// A waiting worker thread
// The condition variable will be awoken by the stop request.
std::jthread waiting_worker([](std::stop_token stoken)
{
std::mutex mutex;
std::unique_lock lock(mutex);
std::condition_variable_any().wait(lock, stoken,
[&stoken] { return false; });
if (stoken.stop_requested())
{
std::cout << "Waiting worker is requested to stop\n";
return;
}
});
// std::jthread::request_stop() can be called explicitly:
std::cout << "Requesting stop of sleepy worker\n";
sleepy_worker.request_stop();
sleepy_worker.join();
std::cout << "Sleepy worker joined\n";
// Or automatically using RAII:
// waiting_worker's destructor will call request_stop()
// and join the thread automatically.
}Возможный вывод:
Requesting stop of sleepy worker Sleepy worker is requested to stop Sleepy worker joined Waiting worker is requested to stop
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/thread/jthread/request_stop