D.7.1. Класс std::thread
Класс std::thread применяется для управления потоком выполнения. В нем имеются средства для запуска нового потока и ожидания завершения потока, а также для идентификации потоков. Также в класс включены другие функции для управления потоком выполнения.
Определение класса
class thread {
public:
// Типы
class id;
typedef implementation-defined
native_handle_type; // необязательно
// Конструкторы и деструкторы
thread() noexcept;
~thread();
template<typename Callable, typename Args...>
explicit thread(Callable&& func, Args&&... args);
// Копирование и перемещение
thread(thread const& other) = delete;
thread(thread&& other) noexcept;
thread& operator=(thread const& other) = delete;
thread& operator=(thread&& other) noexcept;
void swap(thread& other) noexcept;
void join();
void detach();
bool joinable() const noexcept;
id get_id() const noexcept;
native_handle_type native_handle();
static unsigned hardware_concurrency() noexcept;
};
void swap(thread& lhs, thread& rhs);
STD::THREAD::ID , КЛАСС
Экземпляр класса std::thread::id идентифицирует конкретный поток выполнения.
Определение класса
class thread::id {
public:
id() noexcept;
};
bool operator==(thread::id x, thread::id y) noexcept;
bool operator!=(thread::id x, thread::id y) noexcept;
bool operator<(thread::id x, thread::id y) noexcept;
bool operator<=(thread::id x, thread::id y) noexcept;
bool operator>(thread::id x, thread::id y) noexcept;
bool operator>=(thread::id x, thread::id y) noexcept;
template<typename charT, typename traits>
basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>&& out, thread::id id);
Примечание. Значение std::thread::id, идентифицирующее конкретный поток выполнения, должно отличаться от значения экземпляра std::thread::id, сконструированного по умолчанию, и от значения, представляющего любой другой поток.
Примечание. Значения std::thread::id для конкретных потоков непредсказуемы и могут различаться при разных прогонах одной и той же программы.
Экземпляры std::thread::id удовлетворяют требованиям концепций CopyConstructible и CopyAssignable, поэтому их можно копировать и присваивать друг другу
STD::THREAD::ID , КОНСТРУКТОР ПО УМОЛЧАНИЮ
Конструирует объект std::thread::id, который не представляет никакой поток выполнения.
Объявление
id() noexcept;
Результат
Конструирует экземпляр std::thread::id, с которым связано особое значение, интерпретируемое как не поток.
Исключения
Нет.
Примечания. Во всех сконструированных по умолчанию экземпляров std::thread::id хранится одно и то же значение.
STD::THREAD::ID , ОПЕРАТОР СРАВНЕНИЯ НА РАВЕНСТВО
Сравнивает два экземпляра std::thread::id, проверяя, представляют ли они один и тот же поток.
Объявление
bool operator==(
std::thread::id lhs, std::thread::id rhs) noexcept;
Возвращаемое значение
true, если lhs и rhs представляют один и тот же поток выполнения или оба имеют значение не поток, false, если lhs и rhs представляют разные потоки или один представляет поток, а другой имеет значение не поток.
Исключения
Нет.
STD::THREAD::ID , ОПЕРАТОР СРАВНЕНИЯ НА НЕРАВЕНСТВО
Сравнивает два экземпляра std::thread::id, проверяя, представляют ли они разные потоки.
Объявление
bool operator!=(
std::thread::id lhs, std::thread::id rhs) noexcept;
Возвращаемое значение
!(lhs==rhs)
Исключения
Нет.
STD::THREAD::ID , ОПЕРАТОР СРАВНЕНИЯ МЕНЬШЕ
Сравнивает два экземпляра std::thread::id, проверяя, предшествует ли один из них другому в смысле отношения полного порядка, существующего на множестве значений идентификаторов потоков.
Объявление
bool operator<(
std::thread::id lhs, std::thread::id rhs) noexcept;
Возвращаемое значение
true, если значение lhs предшествует значению rhs в смысле отношения полного порядка, существующего на множестве значений идентификаторов потоков. Если lhs != rhs, то истинно ровно одно из утверждений lhs < rhs и rhs < lhs, тогда как второе ложно. Если lhs == rhs, то оба утверждения lhs < rhs и rhs < lhs ложны.
Исключения
Нет.
Примечание. Особое значение не поток, которое хранится в сконструированном по умолчанию экземпляре std::thread::id, меньше любого другого экземпляра std::thread::id, представляющего поток выполнения. Если два экземпляра std::thread::id равны, то ни один из них не меньше другого. Любое множество различных значений std::thread::id полностью упорядочено, и этот порядок остается непротиворечивым на всем протяжении работы программы. Порядок может изменяться при разных прогонах одной и той же программы.
STD::THREAD::ID , ОПЕРАТОР СРАВНЕНИЯ МЕНЬШЕ ИЛИ РАВНО
Сравнивает два экземпляра std::thread::id, проверяя, предшествует ли один из них другому в смысле отношения полного порядка, существующего на множестве значений идентификаторов потоков, или оба экземпляра совпадают.
Объявление
bool operator<=(
std::thread::id lhs, std::thread::id rhs) noexcept;
Возвращаемое значение
!(rhs < lhs)
Исключения
Нет.
STD::THREAD::ID , ОПЕРАТОР СРАВНЕНИЯ БОЛЬШЕ
Сравнивает два экземпляра std::thread::id, проверяя, следует ли один из них за другим в смысле отношения полного порядка, существующего на множестве значений идентификаторов потоков.
Объявление
bool operator>(
std::thread::id lhs, std::thread::id rhs) noexcept;
Возвращаемое значение
rhs < lhs
Исключения
Нет.
STD::THREAD::ID , ОПЕРАТОР СРАВНЕНИЯ БОЛЬШЕ ИЛИ РАВНО
Сравнивает два экземпляра std::thread::id, проверяя, следует ли один из них за другим в смысле отношения полного порядка, существующего на множестве значений идентификаторов потоков, или оба экземпляра совпадают.
Объявление
bool operator>=(
std::thread::id lhs, std::thread::id rhs) noexcept;
Возвращаемое значение
!(lhs < rhs)
Исключения
Нет.
STD::THREAD::ID , ОПЕРАТОР ВСТАВКИ В ПОТОК
Выводит строковое представление значения std::thread::id в указанный поток.
Объявление
template<typename charT, typename traits>
basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>&& out, thread::id id);
Результат
Выводит строковое представление значения std::thread::id в указанный поток. Возвращаемое значение
out
Исключения
Нет.
Примечание. Формат строкового представления не специфицирован. Равные экземпляры имеют одинаковое представление, неравные — различное.
STD::THREAD::NATIVE_HANDLE_TYPE , ПСЕВДОНИМ ТИПА
native_handle_type — это псевдоним типа, который можно использовать в сочетании с платформенно-зависимыми API.
Объявление
typedef implementation-defined native_handle_type;
Примечание. Этот псевдоним типа необязателен. Если он определен, то реализация должна предоставить тип, пригодный для использования в сочетании с платформенно-зависимыми API.
STD::THREAD::NATIVE_HANDLE , ФУНКЦИЯ-ЧЛЕН
Возвращает значение типа native_handle_type, представляющее поток выполнения, ассоциированный с *this.
Объявление
native_handle_type native_handle();
Примечание. Эта функция необязательна. Если она имеется, то возвращаемое значение должно быть пригодно для использования в сочетании с платформенно-зависимыми API.
STD::THREAD , КОНСТРУКТОР ПО УМОЛЧАНИЮ
Конструирует объект std::thread, с которым не ассоциирован никакой поток выполнения.
Объявление
thread() noexcept;
Результат
Конструирует экземпляр std::thread, с которым не ассоциирован никакой поток выполнения.
Постусловия
Для вновь сконструированного объекта x типа std::thread x.get_id()==id().
Исключения
Нет.
STD::THREAD , КОНСТРУКТОР
Конструирует экземпляр std::thread, ассоциированный с новым потоком выполнения.
Объявление
template<typename Callable, typename Args...>
explicit thread(Callable&& func, Args&&... args);
Предусловия
func и каждый элемент списка args должен удовлетворять требованиям концепции MoveConstructible.
Результат
Конструирует экземпляр std::thread и ассоциирует с ним вновь созданный потоком выполнения. Копирует или перемещает аргумент func и все элементы списка args во внутреннюю память, где они хранятся на протяжении всего времени жизни потока выполнения. Вызывает INVOKE(copy-of-func, copy-of-args) в новом потоке выполнения.
Постусловия
Для вновь сконструированного объекта x типа std::thread x.get_id() != id().
Исключения
Исключение типа std::system_error, если не удалось запустить новый поток. Любое исключение, возбужденное при копировании func или args во внутреннюю память.
Синхронизация
Вызов этого конструктора происходит-раньше выполнения переданной функции во вновь созданном потоке выполнения.
STD::THREAD , ПЕРЕМЕЩАЮЩИЙ КОНСТРУКТОР
Передает владение потоком выполнения от существующего объекта std::thread вновь созданному.
Объявление
thread(thread&& other) noexcept;
Результат
Конструирует экземпляр std::thread. Если с объектом other перед вызовом конструктора был ассоциирован поток выполнения, то теперь этот поток оказывается ассоциирован с вновь созданным объектом std::thread. В противном случае с вновь созданным объектом std::thread не ассоциирован никакой поток.
Постусловия
Для вновь сконструированного объекта x типа std::thread x.get_id() равно значению other.get_id() до вызова конструктора, other.get_id() == id().
Исключения
Нет.
Примечание. Объекты std::thread не удовлетворяют требованиям концепции CopyConstructible, поэтому копирующего конструктора не существует, существует только этот перемещающий конструктор.
STD::THREAD , ДЕСТРУКТОР
Уничтожает объект std::thread.
Объявление
~thread();
Результат
Уничтожает *this. Если с *this ассоциирован поток выполнения (this->joinable() возвращает true), то вызывает std::terminate(), то есть аварийно завершает программу.
Исключения
Нет.
STD::THREAD , ПЕРЕМЕЩАЮЩИЙ ОПЕРАТОР ПРИСВАИВАНИЯ
Передает владение потоком выполнения от одного объекта std::thread другому.
Объявление
thread& operator=(thread&& other) noexcept;
Результат
Если до вызова этого оператора this->joinable() возвращала true, то вызывает std::terminate() для аварийного завершения программы. Если с other до вызова оператора был ассоциирован поток выполнения, то после вызова он оказывается ассоциирован с *this. В противном случае с *this не ассоциирован никакой поток выполнения.
Постусловия
this->get_id() равно значению other.get_id() до вызова конструктора. other.get_id() == id().
Исключения
Нет.
Примечание. Объекты std::thread не удовлетворяют требованиям концепции CopyAssignable, поэтому копирующего оператора присваивания не существует, существует только этот перемещающий оператор присваивания.
STD::THREAD::SWAP , ФУНКЦИЯ-ЧЛЕН
Обменивает владение ассоциированными потоками выполнения между двумя объектами std::thread.
Объявление
void swap(thread& other) noexcept;
Результат
Если с other до вызова функции был ассоциирован поток выполнения, то после вызова он оказывается ассоциирован с *this. В противном случае с *this не ассоциирован никакой поток выполнения. Если с *this до вызова функции был ассоциирован поток выполнения, то после вызова он оказывается ассоциирован с other. В противном случае с other не ассоциирован никакой поток выполнения.
Постусловия
this->get_id() равно значению other.get_id() до вызова функции. other.get_id() равно значению this->get_id() до вызова функции.
Исключения
Нет.
STD::THREAD::SWAP , ФУНКЦИЯ, НЕ ЯВЛЯЮЩАЯСЯ ЧЛЕНОМ КЛАССА
Обменивает владение ассоциированными потоками выполнения между двумя объектами std::thread.
Объявление
void swap(thread& lhs, thread& rhs) noexcept;
Результат
lhs.swap(rhs)
Исключения
Нет.
STD::THREAD::JOINABLE , ФУНКЦИЯ-ЧЛЕН
Опрашивает, ассоциирован ли с *this поток выполнения.
Объявление
bool joinable() const noexcept;
Возвращаемое значение
true, если с *this ассоциирован поток выполнения, иначе false.
Исключения
Нет.
STD::THREAD::JOIN , ФУНКЦИЯ-ЧЛЕН
Ожидает завершения потока выполнения, ассоциированного с *this.
Объявление
void jоin();
Предусловия
this->joinable() должна возвращать true.
Результат
Блокирует текущий поток, пока не завершится поток, ассоциированный с *this.
Постусловия
this->get_id() == id(). Поток выполнения, который был ассоциирован с *this до вызова этой функции, завершился.
Синхронизация
Завершение потока выполнения, который был ассоциирован с *this до вызова этой функции, происходит-раньше возврата из jоin().
Исключения
std::system_error, если требуемого эффекта добиться не удалось или если this->joinable() возвращает false.
STD::THREAD::DETACH , ФУНКЦИЯ-ЧЛЕН
Отсоединяет поток выполнения, ассоциированный с *this.
Объявление
void detach();
Предусловия
this->joinable() возвращает true.
Результат
Отсоединяет поток выполнения, ассоциированный с *this.
Постусловия
this->get_id() == id(), this->joinable() == false. Поток выполнения, который был ассоциирован с *this до вызова этой функции, отсоединен и более не ассоциирован ни с каким объектом std::thread.
Исключения
std::system_error, если требуемого эффекта добиться не удалось или если this->joinable() возвращает false в момент вызова.
STD::THREAD::GET_ID , ФУНКЦИЯ-ЧЛЕН
Возвращает значение типа std::thread::id, идентифицирующее поток выполнения, ассоциированный с *this.
Объявление
thread::id get_id() const noexcept;
Возвращаемое значение
Если с *this ассоциирован поток выполнения, то возвращает экземпляр std::thread::id, который идентифицирует этот поток. В противном случае возвращает сконструированный по умолчанию экземпляр std::thread::id.
Исключения
Нет.
STD::THREAD::HARDWARE_CONCURRENCY , СТАТИЧЕСКАЯ ФУНКЦИЯ-ЧЛЕН
Возвращает информацию о том, сколько потоков могут одновременно работать на имеющемся оборудовании.
Объявление
unsigned hardware_concurrency() noexcept;
Возвращаемое значение
Количество потоков, которые могут одновременно исполняться на имеющемся оборудовании. Например, это может быть число процессоров. Если информация недоступна или определена неточно, возвращает 0.
Исключения
Нет.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОК