Namespaces
Variants

std:: stop_source

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
Определено в заголовочном файле <stop_token>
class stop_source ;
(начиная с C++20)

Класс stop_source предоставляет средства для отправки запроса на остановку, например для std::jthread отмены. Запрос на остановку, сделанный для одного объекта stop_source , виден всем stop_source и std::stop_token с тем же связанным состоянием остановки; любые std::stop_callback , зарегистрированные для связанных std::stop_token , будут вызваны, и любые объекты std::condition_variable_any , ожидающие на связанных std::stop_token , будут пробуждены.

После запроса остановки его нельзя отменить. Дополнительные запросы на остановку не имеют эффекта.

Содержание

Функции-члены

создает новый объект stop_source
(public member function)
уничтожает объект stop_source
(public member function)
присваивает объект stop_source
(public member function)
Модификаторы
отправляет запрос на остановку для связанного состояния остановки, если оно есть
(public member function)
обменивает два объекта stop_source
(public member function)
Наблюдатели
возвращает stop_token для связанного состояния остановки
(public member function)
проверяет, был ли отправлен запрос на остановку для связанного состояния остановки
(public member function)
проверяет, может ли быть отправлен запрос на остановку для связанного состояния остановки
(public member function)

Функции, не являющиеся членами класса

(C++20)
сравнивает два объекта std::stop_source
(функция)
специализирует алгоритм std::swap
(функция)

Вспомогательные теги

тег, используемый для stop_source для указания отсутствия связанного состояния остановки при создании
(тег)

Примечания

Для целей отмены std::jthread объект stop_source должен быть получен из объекта std::jthread с использованием get_stop_source() ; или остановка должна быть запрошена непосредственно из объекта std::jthread с использованием request_stop() . Это позволит использовать то же связанное состояние остановки, которое передается в аргумент вызываемой функции std::jthread (т.е. функции, выполняемой в его потоке).

Однако для других случаев stop_source может быть создан отдельно с использованием конструктора по умолчанию, который создаёт новое состояние остановки.

Макрос тестирования возможностей Значение Стандарт Возможность
__cpp_lib_jthread 201911L (C++20) Stop token и joining thread

Пример

#include <chrono>
#include <iostream>
#include <stop_token>
#include <thread>
using namespace std::chrono_literals;
void worker_fun(int id, std::stop_token stoken)
{ 
    for (int i = 10; i; --i)
    {
        std::this_thread::sleep_for(300ms);
        if (stoken.stop_requested())
        {
            std::printf("  worker%d запрошена остановка\n", id);
            return;
        {
        std::printf("  worker%d возвращается в сон\n", id);
    }
}
int main()
{
    std::jthread threads[4];
    std::cout << std::boolalpha;
    auto print = [](const std::stop_source& source)
    {
        std::printf("stop_source stop_possible = %s, stop_requested = %s\n",
                    source.stop_possible() ? "true" : "false",
                    source.stop_requested() ? "true" : "false");
    };
    // Общий источник
    std::stop_source stop_source;
    print(stop_source);
    // Создание рабочих потоков
    for (int i = 0; i < 4; ++i)
        threads[i] = std::jthread(worker_fun, i + 1, stop_source.get_token());
    std::this_thread::sleep_for(500ms);
    std::puts("Запрос остановки");
    stop_source.request_stop();
    print(stop_source);
    // Примечание: деструктор jthreads вызовет join, поэтому явные вызовы не нужны
}

Возможный вывод:

stop_source stop_possible = true, stop_requested = false
  worker2 возвращается в сон
  worker3 возвращается в сон
  worker1 возвращается в сон
  worker4 возвращается в сон
Запрос остановки
stop_source stop_possible = true, stop_requested = true
  worker3 запрошена остановка
  worker1 запрошена остановка
  worker2 запрошена остановка
  worker4 запрошена остановка