std::promise<R>::set_value_at_thread_exit

From cppreference.com
< cpp‎ | thread‎ | promise
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
(C++11)
(C++11)
(C++17)
Generic lock management
(C++11)
(C++11)
(C++17)
(C++11)
(C++14)
(C++11)
(C++11)
(C++11)
(C++11) (C++11) (C++11) (C++11) (C++11) (C++11)
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Safe Reclamation
(C++26)
(C++26)
(C++26)
Hazard Pointers
(C++26)
Atomic types
(C++11)
(C++20)
(C++11)
Initialization of atomic types
(C++11)(deprecated in C++20)
(C++11)(deprecated in C++20)
Memory ordering
(C++11)
(C++11)
Free functions for atomic operations
Free functions for atomic flags
Main template
void set_value_at_thread_exit( const R& value );
(1) (since C++11)
void set_value_at_thread_exit( R&& value );
(2) (since C++11)
void set_value_at_thread_exit( R& value );
(3) (since C++11)
std::promise<void>
void set_value_at_thread_exit();
(4) (since C++11)

Stores the value

The operation behaves as though set_value, set_exception, set_value_at_thread_exit, and set_exception_at_thread_exit

Calls to this function do not introduce data races with calls to get_future (therefore they need not synchronize with each other).

Parameters

value - value to store in the shared state

Return value

(none)

Exceptions

std::future_error on the following conditions:

  • *this has no shared state. The error code is set to no_state.
  • The shared state already stores a value or exception. The error code is set to promise_already_satisfied.

Additionally:

1) Any exception thrown by the constructor selected to copy an object of type R.
2) Any exception thrown by the constructor selected to move an object of type R.

Example

#include <future>
#include <iostream>
#include <thread>
 
int main()
{
    using namespace std::chrono_literals;
    std::promise<int> p;
    std::future<int> f = p.get_future();
    std::thread([&p]
    {
        std::this_thread::sleep_for(1s);
        p.set_value_at_thread_exit(9);
    }).detach();
 
    std::cout << "Waiting... " << std::flush;
    f.wait();
    std::cout << "Done!\nResult is: " << f.get() << '\n';
}

Output:

Waiting... Done!
Result is: 9

Defect reports

The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

DR Applied to Behavior as published Correct behavior
LWG 2098 C++11 it was unclear which exceptions are required to be thrown made clear

See also

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