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.
Исключения
Нет.