std::jthread:: request_stop
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Observers | ||||
| Operations | ||||
| Stop token handling | ||||
|
jthread::request_stop
|
||||
| Non-member functions | ||||
|
bool
request_stop
(
)
noexcept
;
|
(начиная с 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; // Вспомогательная функция для быстрого отображения, какой поток что напечатал void print(auto txt) { std::cout << std::this_thread::get_id() << ' ' << txt; } int main() { // Сонный рабочий поток 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"); } }); // Ожидающий рабочий поток // Переменная условия будет разбужена запросом остановки. 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; }); // Усыпить этот поток, чтобы дать потокам время на выполнение std::this_thread::sleep_for(400ms); // std::jthread::request_stop() может быть вызван явно: print("Requesting stop of sleepy worker\n"); sleepy_worker.request_stop(); sleepy_worker.join(); print("Sleepy worker joined\n"); // Или автоматически с использованием RAII: // Деструктор waiting_worker вызовет request_stop() // и автоматически присоединит поток. }
Возможный вывод:
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