std::jthread
Определён в заголовочном файле <thread> | ||
|---|---|---|
class jthread; | (начиная с C++20) |
Класс jthread представляет собой отдельный поток выполнения. Он ведёт себя в целом так же, как std::thread, за исключением того, что jthread автоматически присоединяется при уничтожении и в определённых ситуациях может быть отменён/остановлен.
Потоки начинают выполнение сразу после конструирования соответствующего объекта потока (с учётом возможных задержек планирования со стороны ОС), начиная с функции верхнего уровня, переданной в качестве аргумента конструктора. Возвращаемое значение функции верхнего уровня игнорируется; если её выполнение завершается выбросом исключения, вызывается std::terminate. Функция верхнего уровня может передать вызывающему коду возвращаемое значение или исключение с помощью std::promise либо изменить общие переменные (для чего может потребоваться синхронизация; см. std::mutex и std::atomic).
В отличие от std::thread, jthread логически содержит внутренний закрытый член типа std::stop_source, который поддерживает общее состояние остановки. Конструктор jthread принимает функцию, первым аргументом которой является std::stop_token; этот аргумент передаётся объектом jthread из его внутреннего std::stop_source. Это позволяет функции проверять во время выполнения, не был ли запрошен останов, и завершаться, если такой запрос поступил.
Объекты std::jthread также могут находиться в состоянии, не представляющем никакого потока (после конструирования по умолчанию, перемещения, detach или join), а поток выполнения может быть не связан ни с одним объектом jthread (после detach).
Никакие два объекта std::jthread не могут представлять один и тот же поток выполнения; std::jthread не удовлетворяет требованиям CopyConstructible или CopyAssignable, хотя удовлетворяет требованиям MoveConstructible и MoveAssignable.
Типы-члены
| Тип-член | Определение |
|---|---|
id |
std::thread::id |
native_handle_type (необязательный*) |
std::thread::native_handle_type |
Функции-члены
создаёт новый объект jthread (открытая функция-член) |
|
| если поток можно присоединить, запрашивает его останов и присоединяет его (открытая функция-член) |
|
перемещает объект jthread (открытая функция-член) |
|
Наблюдатели |
|
| проверяет, можно ли присоединить поток, то есть может ли он выполняться параллельно (открытая функция-член) |
|
| возвращает идентификатор потока (открытая функция-член) |
|
| возвращает дескриптор потока, определяемый реализацией (открытая функция-член) |
|
|
[static] | возвращает количество одновременно выполняемых потоков, поддерживаемое реализацией (открытая статическая функция-член) |
Операции |
|
| ожидает завершения потока (открытая функция-член) |
|
| позволяет потоку выполняться независимо от дескриптора потока (открытая функция-член) |
|
| обменивает местами два объекта jthread (открытая функция-член) |
|
Работа с токеном остановки |
|
возвращает объект stop_source, связанный с общим состоянием остановки потока (открытая функция-член) |
|
возвращает объект stop_token, связанный с общим состоянием остановки потока (открытая функция-член) |
|
| запрашивает останов выполнения через общее состояние остановки потока (открытая функция-член) |
|
Функции, не являющиеся членами
|
(C++20) | специализирует алгоритм std::swap (функция) |
Примечания
| Макрос проверки возможностей | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_jthread | 201911L | (C++20) | Токен остановки и присоединяемый поток |
См. также
|
(C++11) | управляет отдельным потоком (класс) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/thread/jthread