32 Thread support library [thread]
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&) = delete;
~promise();
promise& operator=(promise&& rhs) noexcept;
promise& operator=(const promise&) = delete;
void swap(promise& other) noexcept;
future<R> get_future();
void set_value(see below);
void set_exception(exception_ptr p);
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>;
}
The implementation provides the template
promise and two specializations,
promise<R&> and
promise<void>. These differ only in the argument type
of the member functions
set_value and
set_value_at_thread_exit,
as set out in their descriptions, below
.The
set_value,
set_exception,
set_value_at_thread_exit,
and
set_exception_at_thread_exit member functions behave as though
they acquire a single mutex associated with the promise object while updating the
promise object
.template<class R, class Alloc>
struct uses_allocator<promise<R>, Alloc>
: true_type { };
Preconditions:
Alloc meets the
Cpp17Allocator
requirements (Table
36)
. promise();
template<class Allocator>
promise(allocator_arg_t, const Allocator& a);
Effects: Creates a shared state
. The second
constructor uses the allocator
a to allocate memory for the shared
state
.promise(promise&& rhs) noexcept;
Effects: Transfers ownership of the shared state
of
rhs (if any) to the newly-constructed object
. Postconditions:
rhs has no shared state
. promise& operator=(promise&& rhs) noexcept;
Effects: Abandons any shared state (
[futures.state]) and then as if
promise(std::move(rhs)).swap(*this). void swap(promise& other) noexcept;
Effects: Exchanges the shared state of
*this and
other. Postconditions:
*this has the shared state (if any) that
other had
prior to the call to
swap. other has the shared state (if any) that
*this had prior to the call to
swap. Returns: A
future<R> object with the same shared state as
*this. Synchronization: Calls to this function do not introduce
data races (
[intro.multithread]) with calls to
set_value,
set_exception,
set_value_at_thread_exit, or
set_exception_at_thread_exit. [
Note 1:
Such calls need not synchronize with each other
. —
end note]
Throws:
future_error if
*this has no shared state or if
get_future has already been called on a
promise with the same
shared state as
*this. Error conditions:
future_already_retrieved if
get_future has already been called on
a
promise with the same shared state as
*this. no_state if
*this has no shared state
.
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: Atomically stores the value
r in the shared state and
makes that state ready (
[futures.state])
. Throws:
- future_error if its shared state
already has a stored value or exception, or
- for the first version, any exception thrown by the constructor selected to copy an object of R, or
- for the second version, any exception thrown by the constructor selected to move an object of R.
Error conditions:
promise_already_satisfied if its shared state
already has a stored value or exception
. no_state if
*this has no shared state
.
void set_exception(exception_ptr p);
Preconditions:
p is not null
. Effects: Atomically stores the exception pointer
p in the shared state
and makes that state ready (
[futures.state])
. Throws:
future_error if its shared state
already has a stored value or exception
. Error conditions:
promise_already_satisfied if its shared state
already has a stored value or exception
. no_state if
*this has no shared state
.
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: Stores the value
r in the shared state without making that
state ready immediately
. Schedules that state to be made ready when the current
thread exits, after all objects of thread storage duration associated with the
current thread have been destroyed
.Throws:
- future_error if its shared state
already has a stored value or exception, or
- for the first version, any exception thrown by the constructor selected to copy an object of R, or
- for the second version, any exception thrown by the constructor selected to move an object of R.
Error conditions:
promise_already_satisfied if its shared state
already has a stored value or exception
. no_state if
*this has no shared state
.
void set_exception_at_thread_exit(exception_ptr p);
Preconditions:
p is not null
. Effects: Stores the exception pointer
p in the shared state without
making that state ready immediately
. Schedules that state to be made ready when
the current thread exits, after all objects of thread storage duration
associated with the current thread have been destroyed
.Throws:
future_error if an error condition occurs
. Error conditions:
promise_already_satisfied if its shared state
already has a stored value or exception
. no_state if
*this has no shared state
.
template<class R>
void swap(promise<R>& x, promise<R>& y) noexcept;
Effects: As if by
x.swap(y).