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.

Исключения

Нет.