Spec-Zone.ru › C++

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API