Параллельное программирование на С++ в действии — страница 52 из 53

В заголовке

объявлены средства для идентификации и управления потоками, а также функции для приостановки потоков.

Содержимое заголовка

namespace std {


class thread;


namespace this_thread {

thread::id get_id() noexcept;


void yield() noexcept;


template

void sleep_for(

 std::chrono::duration sleep_duration);


template

void sleep_until(

 std::chrono::time_point wake_time);

}

}

D.7.1. Класс
std::thread

Класс s

td::thread
применяется для управления потоком выполнения. В нем имеются средства для запуска нового потока и ожидания завершения потока, а также для идентификации потоков. Также в класс включены другие функции для управления потоком выполнения.

Определение класса

class thread {

public:

 // Типы

 class id;

 typedef implementation-defined

 native_handle_type; // необязательно


 // Конструкторы и деструкторы

 thread() noexcept;

 ~thread();


 template

 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

basic_ostream&

 operator<<(basic_ostream&& 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

basic_ostream&

operator<<(basic_ostream&& 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

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
, ФУНКЦИЯ-ЧЛЕН

Возвращает значение типа s

td::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.

Исключения

Нет.

D.7.2. Пространство имен
this_thread

Функции из пространства имен

std::this_thread
применяются к вызывающему потоку.

STD::THIS_THREAD::GET_ID
, ФУНКЦИЯ, НЕ ЯВЛЯЮЩАЯСЯ ЧЛЕНОМ КЛАССА

Возвращает значение типа

std::thread::id
, идентифицирующее текущий поток выполнения.

Объявление

thread::id get_id() noexcept;

Возвращаемое значение

Экземпляр

std::thread::id
, идентифицирующий текущий поток выполнения.

Исключения

Нет.

STD::THIS_THREAD::YIELD
, ФУНКЦИЯ, HE ЯВЛЯЮЩАЯСЯ ЧЛЕНОМ КЛАССА

Информирует библиотеку о том, что поток, вызвавший эту функцию, в данный момент не хочет выполняться. Обычно используется в коротких циклах, чтобы не потреблять излишне много процессорного времени.

Объявление

void yield() noexcept;

Результат

Предоставляет библиотеке возможность запланировать другой поток вместо текущего.

Исключения

Нет.

STD::THIS_THREAD::SLEEP_FOR
, ФУНКЦИЯ, НЕ ЯВЛЯЮЩАЯСЯ ЧЛЕНОМ КЛАССА

Приостанавливает выполнение текущего потока на указанное время.

Объявление

template

void sleep_for(

 std::chrono::duration const& relative_time);

Результат

Приостанавливает выполнение текущего потока на указанное время

relative_time
.

Примечание. Поток может быть блокирован дольше, чем указано. Если возможно, истекшее время измеряется по стабильным часам.

Исключения

Нет.

STD::THIS_THREAD::SLEEP_UNTIL
, ФУНКЦИЯ, НЕ ЯВЛЯЮЩАЯСЯ ЧЛЕНОМ КЛАССА

Приостанавливает выполнение текущего потока до указанного момента времени.

Объявление

template

void sleep_until(

 std::chrono::time_point const& absolute_time);

Результат

Приостанавливает выполнение текущего потока до наступления момента

absolute_time
по указанным часам
Clock
.

Примечание. Не дается никаких гарантий относительно того, сколько времени будет блокирован вызывающий поток. Гарантируется лишь, что значение, возвращенное

Clock::now()
, больше или равно
absolute_time
в точке, где поток разблокировался.

Исключения

Нет.

Ресурсы