[thread.threads] описывает компоненты, которые можно использовать для создания потоков и управления ими. [ Note: Эти потоки предназначены для взаимно-однозначного сопоставления с потоками операционной системы. ] — end note
namespace std { class thread; void swap(thread& x, thread& y) noexcept; namespace this_thread { thread::id get_id() noexcept; void yield() noexcept; template <class Clock, class Duration> void sleep_until(const chrono::time_point<Clock, Duration>& abs_time); template <class Rep, class Period> void sleep_for(const chrono::duration<Rep, Period>& rel_time); } }
Классthread предоставляет механизм для создания нового потока выполнения, для соединения с потоком (т. Е. Ожидания завершения потока) и для выполнения других операций, которые управляют и запрашивают состояние потока.thread Объект однозначно представляет собой конкретный поток выполнения. Это представление может быть передано другимthread объектам таким образом, чтобы никакие дваthread объекта одновременно не представляли один и тот же поток выполнения. Поток исполнения - этоdetached когда никакойthread объект не представляет этот поток. Объекты классаthread могут находиться в состоянии, не представляющем поток выполнения. [ Объект не представляет собой поток выполнения после окончания строительства по умолчанию, после перемещения из, или после успешного вызова или . ] Note: thread detach join — end note
namespace std { class thread { public: // types: class id; using native_handle_type = implementation-defined; // See [thread.req.native] // construct/copy/destroy: thread() noexcept; template <class F, class... Args> explicit thread(F&& f, Args&&... args); ~thread(); thread(const thread&) = delete; thread(thread&&) noexcept; thread& operator=(const thread&) = delete; thread& operator=(thread&&) noexcept; // members: void swap(thread&) noexcept; bool joinable() const noexcept; void join(); void detach(); id get_id() const noexcept; native_handle_type native_handle(); // See [thread.req.native] // static members: static unsigned hardware_concurrency() noexcept; }; }
namespace std {
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<class charT, class traits>
basic_ostream<charT, traits>&
operator<< (basic_ostream<charT, traits>& out, thread::id id);
// Hash support
template <class T> struct hash;
template <> struct hash<thread::id>;
}
Объект типаthread::id предоставляет уникальный идентификатор для каждого потока выполнения и одно отличное значение для всехthread объектов, которые не представляют поток выполнения ([thread.thread.class]). Каждый поток выполнения имеет связанныйthread::id объект, который не равен thread::id объекту любого другого потока выполнения и который не равенthread::id объекту любогоthread объекта, который не представляет потоки выполнения.
thread::id должен бытьtrivially copyable class. Библиотека может повторно использовать значениеthread::id завершенного потока, который больше не может быть присоединен.
[ Note: Операторы отношения позволяют использоватьthread::id объекты в качестве ключей в ассоциативных контейнерах. ] — end note
id() noexcept;
bool operator==(thread::id x, thread::id y) noexcept;
Returns:true только в том случае, еслиx иy представляют один и тот же поток выполнения или не представляютx ниy один поток выполнения.
bool operator!=(thread::id x, thread::id y) noexcept;
bool operator<(thread::id x, thread::id y) noexcept;
Returns: Такое значение, котороеoperator< представляет собой общий порядок, как описано в[alg.sorting].
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<class charT, class traits>
basic_ostream<charT, traits>&
operator<< (basic_ostream<charT, traits>& out, thread::id id);
Effects: Вставляет неопределенное текстовое представлениеid в out. Для двух объектов типаthread::idx иy, еслиx == y этиthread::id объекты будут иметь то же текстовое представление , и еслиx != y этиthread::id объекты имеют различные текстовые представления.
template <> struct hash<thread::id>;
Специализация включена ([unord.hash]).
thread() noexcept;
template <class F, class... Args> explicit thread(F&& f, Args&&... args);
Requires: F и каждыйTi вArgs должны удовлетворять MoveConstructible требованиям. INVOKE(DECAY_COPY(std::forward<F>(f)), DECAY_COPY(std::forward<Args>(args))...) ([func.require]) должно быть допустимым выражением.
Remarks: Этот конструктор не должен участвовать в разрешении перегрузки, еслиdecay_t<F> он того же типа, что иstd::thread.
Effects: Создает объект типаthread. Новый поток выполнения выполняется INVOKE(DECAY_COPY(std::forward<F>(f)), DECAY_COPY(std::forward<Args>(args))...) с вызовами, DECAY_COPY которые оцениваются в потоке построения. Любое возвращаемое значение из этого вызова игнорируется. [ Note: Это означает, что любые исключения, не возникшие при вызове копии,f будут выброшены в потоке построения, а не в новом потоке. ] Если вызов завершается неперехваченным исключением, должен вызываться. — end note INVOKE(DECAY_COPY(std::forward<F>(f)), DECAY_COPY(std::forward<Args>(args))...)terminate
thread(thread&& x) noexcept;
Effects: Создает объект типаthread изxи устанавливает x в сконструированное состояние по умолчанию.
~thread();
Еслиjoinable(), звонитterminate(). В противном случае не имеет никакого эффекта. [ Note: Неявное отсоединение или присоединение кjoinable() потоку в его деструкторе может привести к трудностям в отладке ошибок корректности (для отсоединения) или производительности (для присоединения), обнаруживаемых только при возникновении исключения. Таким образом, программист должен гарантировать, что деструктор никогда не будет выполняться, пока поток все еще может быть присоединен. ] — end note
thread& operator=(thread&& x) noexcept;
Effects: Еслиjoinable(), звонитterminate(). В противном случае, присваивает состояние ,x чтобы*this и множествx в состояние по умолчанию строится.
void swap(thread& x) noexcept;
bool joinable() const noexcept;
void join();
Synchronization: Завершение потока, представленное*thissynchronizes with соответствующим успешным join() возвратом. [ Note: Операции на *this не синхронизированы. ] — end note
Throws:system_error когда требуется исключение ([thread.req.exception]).
void detach();
Effects: Поток, представленный как,*this продолжает выполнение без блокировки вызывающего потока. Когдаdetach() возвращается,*this больше не представляет собой возможно продолжающийся поток выполнения. Когда поток, ранее представленный как*this завершает выполнение, реализация должна освободить все принадлежащие ей ресурсы.
Throws:system_error когда требуется исключение ([thread.req.exception]).
id get_id() const noexcept;
unsigned hardware_concurrency() noexcept;
void swap(thread& x, thread& y) noexcept;
namespace std::this_thread { thread::id get_id() noexcept; void yield() noexcept; template <class Clock, class Duration> void sleep_until(const chrono::time_point<Clock, Duration>& abs_time); template <class Rep, class Period> void sleep_for(const chrono::duration<Rep, Period>& rel_time); }
thread::id this_thread::get_id() noexcept;
Returns: Объект типа,thread::id который однозначно идентифицирует текущий поток выполнения. Никакой другой поток выполнения не должен иметь этого идентификатора, и этот поток выполнения всегда должен иметь этот идентификатор. Возвращенный объект не должен сравниваться с созданным по умолчанию thread::id.
void this_thread::yield() noexcept;
template <class Clock, class Duration>
void sleep_until(const chrono::time_point<Clock, Duration>& abs_time);
Effects: Блокирует вызывающий поток на время абсолютного тайм-аута ([thread.req.timing]), указанное вabs_time.
Throws: Исключения, связанные с тайм-аутом ([thread.req.timing]).
template <class Rep, class Period>
void sleep_for(const chrono::duration<Rep, Period>& rel_time);
Effects: Блокирует вызывающий поток в течение относительного времени ожидания ([thread.req.timing]), указанного вrel_time.
Throws: Исключения, связанные с тайм-аутом ([thread.req.timing]).