33 Thread support library [thread]

33.3 Threads [thread.threads]

33.3.2 Class thread [thread.thread.class]

Классthread предоставляет механизм для создания нового потока выполнения, для соединения с потоком (т. Е. Ожидания завершения потока) и для выполнения других операций, которые управляют и запрашивают состояние потока.thread Объект однозначно представляет собой конкретный поток выполнения. Это представление может быть передано другимthread объектам таким образом, чтобы никакие дваthread объекта одновременно не представляли один и тот же поток выполнения. Поток исполнения - этоdetached когда никакойthread объект не представляет этот поток. Объекты классаthread могут находиться в состоянии, не представляющем поток выполнения. [ Объект не представляет собой поток выполнения после окончания строительства по умолчанию, после перемещения из, или после успешного вызова или . ]Note: thread detach joinend 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;
  };
}

33.3.2.1 Class thread​::​id [thread.thread.id]

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;

Effects: Создает объект типаid.

Postconditions: Созданный объект не представляет собой поток выполнения.

bool operator==(thread::id x, thread::id y) noexcept;

Returns:true только в том случае, еслиx иy представляют один и тот же поток выполнения или не представляютx ниy один поток выполнения.

bool operator!=(thread::id x, thread::id y) noexcept;

Returns:!(x == y)

bool operator<(thread::id x, thread::id y) noexcept;

Returns: Такое значение, котороеoperator< представляет собой общий порядок, как описано в[alg.sorting].

bool operator<=(thread::id x, thread::id y) noexcept;

Returns:!(y < x).

bool operator>(thread::id x, thread::id y) noexcept;

Returns:y < x.

bool operator>=(thread::id x, thread::id y) noexcept;

Returns:!(x < y).

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 объекты имеют различные текстовые представления.

Returns:out.

template <> struct hash<thread::id>;

Специализация включена ([unord.hash]).

33.3.2.2 thread constructors [thread.thread.constr]

thread() noexcept;

Effects: Создаетthread объект, не представляющий поток выполнения.

Postconditions:get_­id() == id().

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 noteINVOKE(​DECAY_­COPY(​std​::​forward<F>(f)), DECAY_­COPY(​std​::​forward<Args>(args))...)terminate

Synchronization: Завершение вызова конструктора синхронизируется с началом вызова копииf.

Postconditions:get_­id() != id().*this представляет только что запущенный поток.

Throws:system_­error если не удается начать новый поток.

Error conditions:

  • resource_­unavailable_­try_­again - системе не хватало ресурсов, необходимых для создания другого потока, или установленный системой лимит на количество потоков в процессе был бы превышен.

thread(thread&& x) noexcept;

Effects: Создает объект типаthread изxи устанавливает x в сконструированное состояние по умолчанию.

Postconditions:x.get_­id() == id() иget_­id() возвращает значениеx.get_­id() до начала строительства.

33.3.2.3 thread destructor [thread.thread.destr]

~thread();

Еслиjoinable(), звонитterminate(). В противном случае не имеет никакого эффекта. [ Note: Неявное отсоединение или присоединение кjoinable() потоку в его деструкторе может привести к трудностям в отладке ошибок корректности (для отсоединения) или производительности (для присоединения), обнаруживаемых только при возникновении исключения. Таким образом, программист должен гарантировать, что деструктор никогда не будет выполняться, пока поток все еще может быть присоединен. ] end note

33.3.2.4 thread assignment [thread.thread.assign]

thread& operator=(thread&& x) noexcept;

Effects: Еслиjoinable(), звонитterminate(). В противном случае, присваивает состояние ,x чтобы*this и множествx в состояние по умолчанию строится.

Postconditions:x.get_­id() == id() иget_­id() возвращает значение x.get_­id() до присвоения.

Returns:*this.

33.3.2.5 thread members [thread.thread.member]

void swap(thread& x) noexcept;

Effects: Меняет местами состояние*this иx.

bool joinable() const noexcept;

Returns:get_­id() != id().

void join();

Effects:  Блокируется до тех пор, пока поток, представленный значком,*this не будет завершен.

Synchronization: Завершение потока, представленное*thissynchronizes with соответствующим успешным join() возвратом. [ Note: Операции на *this не синхронизированы. ]end note

Postconditions: Цепочка, представленная*this значком, завершена.get_­id() == id().

Throws:system_­error когда требуется исключение ([thread.req.exception]).

Error conditions:

  • resource_­deadlock_­would_­occur - при обнаружении тупика или get_­id() == this_­thread​::​​get_­id().

  • no_­such_­process - если нить недействительна.

  • invalid_­argument - если поток не может быть присоединен.

void detach();

Effects: Поток, представленный как,*this продолжает выполнение без блокировки вызывающего потока. Когдаdetach() возвращается,*this больше не представляет собой возможно продолжающийся поток выполнения. Когда поток, ранее представленный как*this завершает выполнение, реализация должна освободить все принадлежащие ей ресурсы.

Postconditions:get_­id() == id().

Throws:system_­error когда требуется исключение ([thread.req.exception]).

Error conditions:

  • no_­such_­process - если нить недействительна.

  • invalid_­argument - если поток не может быть присоединен.

id get_id() const noexcept;

Returns: Созданный по умолчаниюid объект, если*this он не представляет поток, в противном случаеthis_­thread​::​get_­id() для потока выполнения, представленного *this.

33.3.2.6 thread static members [thread.thread.static]

unsigned hardware_concurrency() noexcept;

Returns: Количество контекстов аппаратного потока. [ Note: Это значение следует рассматривать только как подсказку. ] Если это значение не вычислимо или точно не определено, реализация должна вернуть 0. end note

33.3.2.7 thread specialized algorithms [thread.thread.algorithm]

void swap(thread& x, thread& y) noexcept;

Effects: Как будто мимоx.swap(y).