33 Thread support library [thread]

33.6 Futures [futures]

33.6.6 Class template promise [futures.promise]

namespace std {
  template <class R>
  class promise {
  public:
    promise();
    template <class Allocator>
      promise(allocator_arg_t, const Allocator& a);
    promise(promise&& rhs) noexcept;
    promise(const promise& rhs) = delete;
    ~promise();

    // assignment
    promise& operator=(promise&& rhs) noexcept;
    promise& operator=(const promise& rhs) = delete;
    void swap(promise& other) noexcept;

    // retrieving the result
    future<R> get_future();

    // setting the result
    void set_value(see below);
    void set_exception(exception_ptr p);

    // setting the result with deferred notification
    void set_value_at_thread_exit(see below);
    void set_exception_at_thread_exit(exception_ptr p);
  };
  template <class R>
    void swap(promise<R>& x, promise<R>& y) noexcept;
  template <class R, class Alloc>
    struct uses_allocator<promise<R>, Alloc>;
}

Реализация должна предоставлять шаблонpromise и две специализации, promise<R&> иpromise<​void>. Они различаются только типом аргумента функций-членовset_­value иset_­value_­at_­thread_­exit, как указано в их описаниях ниже.

set_­value,set_­exception,set_­value_­at_­thread_­exit, Иset_­exception_­at_­thread_­exit функция - членов ведут себя так , как будто они приобретают один семафор , связанный с объектом обещания при обновлении объекта обещания.

template <class R, class Alloc> struct uses_allocator<promise<R>, Alloc> : true_type { };

Requires:Alloc должен бытьAllocator.

promise(); template <class Allocator> promise(allocator_arg_t, const Allocator& a);

Effects: создаетpromise объект и общее состояние. Второй конструктор использует распределительa для выделения памяти для общего состояния.

promise(promise&& rhs) noexcept;

Effects: создает новыйpromise объект и передает право собственности на совместно используемое состояниеrhs (если таковое имеется) на вновь созданный объект.

Postconditions:rhs не имеет общего состояния.

~promise();

Effects: Отменяет любое общее состояние ([futures.state]).

promise& operator=(promise&& rhs) noexcept;

Effects: Отменяет любое разделяемое состояние ([futures.state]), а затем как если бы promise(std​::​move(rhs)).swap(*this).

Returns:*this.

void swap(promise& other) noexcept;

Effects: Меняет общее состояние*this иother.

Postconditions:*this имеет общее состояние (если есть), котороеother было до вызоваswap.other имеет общее состояние (если есть), которое *this было до вызоваswap.

future<R> get_future();

Returns: future<R> Объект с тем же общим состоянием как *this.

Throws:future_­error если*this не имеет общего состояния или если get_­future уже был вызван вpromise с тем же общим состоянием, что и*this.

Error conditions:

  • future_­already_­retrieved ifget_­future уже был вызванpromise с тем же общим состоянием, что и*this.

  • no_­state если*this не имеет общего состояния.

void promise::set_value(const R& r); void promise::set_value(R&& r); void promise<R&>::set_value(R& r); void promise<void>::set_value();

Effects: Атомарно сохраняет значениеr в общем состоянии и делает это состояние готовым ([futures.state]).

Throws:

  • future_­error если его общее состояние уже имеет сохраненное значение или исключение, или

  • для первой версии любое исключение, созданное конструктором, выбранным для копирования объектаR, или

  • для второй версии любое исключение, созданное конструктором, выбранным для перемещения объектаR.

Error conditions:

  • promise_­already_­satisfied если его общее состояние уже имеет сохраненное значение или исключение.

  • no_­state если*this не имеет общего состояния.

void set_exception(exception_ptr p);

Requires:p не равно нулю.

Effects: Атомарно сохраняет указатель исключенияp в общем состоянии и делает это состояние готовым ([futures.state]).

Throws:future_­error если его общее состояние уже имеет сохраненное значение или исключение.

Error conditions:

  • promise_­already_­satisfied если его общее состояние уже имеет сохраненное значение или исключение.

  • no_­state если*this не имеет общего состояния.

void promise::set_value_at_thread_exit(const R& r); void promise::set_value_at_thread_exit(R&& r); void promise<R&>::set_value_at_thread_exit(R& r); void promise<void>::set_value_at_thread_exit();

Effects: Сохраняет значениеr в общем состоянии, не делая это состояние немедленно готовым. Планирует, что состояние будет подготовлено к выходу из текущего потока после того, как все объекты продолжительности хранения потока, связанные с текущим потоком, будут уничтожены.

Throws:

  • future_­error если его общее состояние уже имеет сохраненное значение или исключение, или

  • для первой версии любое исключение, созданное конструктором, выбранным для копирования объектаR, или

  • для второй версии любое исключение, созданное конструктором, выбранным для перемещения объектаR.

Error conditions:

  • promise_­already_­satisfied если его общее состояние уже имеет сохраненное значение или исключение.

  • no_­state если*this не имеет общего состояния.

void set_exception_at_thread_exit(exception_ptr p);

Requires:p не равно нулю.

Effects: Сохраняет указатель исключенияp в общем состоянии, не делая это состояние немедленно готовым. Планирует, что состояние будет подготовлено к выходу из текущего потока после того, как все объекты продолжительности хранения потока, связанные с текущим потоком, будут уничтожены.

Throws:future_­error если возникает состояние ошибки.

Error conditions:

  • promise_­already_­satisfied если его общее состояние уже имеет сохраненное значение или исключение.

  • no_­state если*this не имеет общего состояния.

template <class R> void swap(promise<R>& x, promise<R>& y) noexcept;

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