std:: stop_source
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Modifiers | ||||
| Observers | ||||
| Non-member functions | ||||
| Helper tags | ||||
|
Определено в заголовочном файле
<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
(функция) |
|
(C++20)
|
специализирует алгоритм
std::swap
(функция) |
Вспомогательные теги
|
(C++20)
|
тег, используемый для
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 запрошена остановка