std::promise - cppreference.com

From cppreference.com

Defined in header

<future>

template<classR>classpromise; (1) (since C++11)template<classR>classpromise<R&>; (2) (since C++11)template<>classpromise<void>; (3) (since C++11)1) Base template.

2) Non-void specialization, used to communicate objects between threads.

3) void specialization, used to communicate stateless events.

The class template std::promise provides a facility to store a value or an exception that is later acquired asynchronously via a

std::future

object created by the std::promise object. Note that the std::promise object is meant to be used only once.

Each promise is associated with a shared state, which contains some state information and a result which may be not yet evaluated, evaluated to a value (possibly void) or evaluated to an exception. A promise may do three things with the shared state:

make ready: the promise stores the result or the exception in the shared state. Marks the state ready and unblocks any thread waiting on a future associated with the shared state.

release: the promise gives up its reference to the shared state. If this was the last such reference, the shared state is destroyed. Unless this was a shared state created by std::async which is not yet ready, this operation does not block.

abandon: the promise stores the exception of type

std::future_error

with error code

std::future_errc::broken_promise

, makes the shared state ready, and then releases it.

The promise is the "push" end of the promise-future communication channel: the operation that stores a value in the shared state synchronizes-with (as defined in

std::memory_order

) the successful return from any function that is waiting on the shared state (such as

std::future::get

). Concurrent access to the same shared state may conflict otherwise: for example multiple callers of

std::shared_future::get

must either all be read-only or provide external synchronization.

Member functions

(constructor)

constructs the promise object
(public member function)

[edit]

(destructor)

destructs the promise object
(public member function)

[edit]

operator=

assigns the shared state
(public member function)

[edit]

swap

swaps two promise objects
(public member function)

[edit]

Getting the result

get_future

returns a

future

associated with the promised result
(public member function)

[edit]

Setting the result

set_value

sets the result to specific value
(public member function)

[edit]

set_value_at_thread_exit

sets the result to specific value while delivering the notification only at thread exit
(public member function)

[edit]

set_exception

sets the result to indicate an exception
(public member function)

[edit]

set_exception_at_thread_exit

sets the result to indicate an exception while delivering the notification only at thread exit
(public member function)

[edit]

Non-member functions

Helper classes

Example

This example shows how promise<int> can be used as signals between threads.

Run this code

#include<chrono>#include<future>#include<iostream>#include<numeric>#include<thread>#include<vector>voidaccumulate(std::vector<int>::iteratorfirst,std::vector<int>::iteratorlast,std::promise<int>accumulate_promise){intsum=std::accumulate(first,last,0);accumulate_promise.set_value(sum);// Notify future}voiddo_work(std::promise<void>barrier){std::this_thread::sleep_for(std::chrono::seconds(1));barrier.set_value();}intmain(){// Demonstrate using promise<int> to transmit a result between threads.std::vector<int>numbers={1,2,3,4,5,6};std::promise<int>accumulate_promise;std::future<int>accumulate_future=accumulate_promise.get_future();std::threadwork_thread(accumulate,numbers.begin(),numbers.end(),std::move(accumulate_promise));// future::get() will wait until the future has a valid result and retrieves it.// Calling wait() before get() is not needed// accumulate_future.wait(); // wait for resultstd::cout<<"result="<<accumulate_future.get()<<'\n';work_thread.join();// wait for thread completion// Demonstrate using promise<void> to signal state between threads.std::promise<void>barrier;std::future<void>barrier_future=barrier.get_future();std::threadnew_work_thread(do_work,std::move(barrier));barrier_future.wait();new_work_thread.join();}Output:

result=21