# std::promise<R>::set_value

< cpp‎ | thread‎ | promise

void set_value( const R& value ); | (1) | (C++11 起) (仅为泛型 `promise` 模板的成员)
void set_value( R&& value ); | (2) | (C++11 起) (仅为泛型 `promise` 模板的成员)
void set_value( R& value ); | (3) | (C++11 起) (仅为 `promise<R&>` 模板特化的成员)
void set_value(); | (4) | (C++11 起) (仅为 `promise<void>` 模板特化的成员)

1-3) 原子地存储 `value` 到共享状态，并令状态就绪。
4) 使状态就绪。

`set_value` 、 set_exception 、 set_value_at_thread_exit 和 set_exception_at_thread_exit 的操作表现类似。在更新 `promise` 对象时获得单个与 `promise` 对象关联的互斥。

若无共享状态或共享状态已存储值或异常，则抛出异常。

对此函数的调用和对 get_future 的调用不会造成数据竞争（但它们不需要彼此同步）。

### 参数

value | - | 要存储于共享状态的值

### 返回值

（无）

### 异常

遇到下列条件时为 std::future_error ：

- *this 无共享状态。设置 error_category 为 `no_state` 。

- 共享状态已存储值或异常。设置 error_category 为 `promise_already_satisfied` 。

另外；

1, 3) `value` 的复制构造函数所抛的任何异常
2) `value` 的移动构造函数所抛的任何异常

### 示例

这显示能如何将 `promise<void>` 用于在线程间发信号。

    #include <thread>
    #include <future>
    #include <cctype>
    #include <vector>
    #include <algorithm>
    #include <iterator>
    #include <iostream>
    #include <sstream>

    int main()
    {
        std::istringstream iss_numbers{"3 4 1 42 23 -23 93 2 -289 93"};
        std::istringstream iss_letters{" a 23 b,e a2 k k?a;si,ksa c"};

        std::vector<int> numbers;
        std::vector<char> letters;
        std::promise<void> numbers_promise, letters_promise;

        auto numbers_ready = numbers_promise.get_future();
        auto letter_ready = letters_promise.get_future();

        std::thread value_reader([&]
        {
            // I/O 操作。
            std::copy(std::istream_iterator<int>{iss_numbers},
                      std::istream_iterator<int>{},
                      std::back_inserter(numbers));

            // 为数字提醒。
            numbers_promise.set_value();

            std::copy_if(std::istreambuf_iterator<char>{iss_letters},
                         std::istreambuf_iterator<char>{},
                         std::back_inserter(letters),
                         ::isalpha);

            // 为字母提醒。
            letters_promise.set_value();
        });

        numbers_ready.wait();

        std::sort(numbers.begin(), numbers.end());

        if (letter_ready.wait_for(std::chrono::seconds(1)) ==
                std::future_status::timeout)
        {
            // 在获得字母的同时输出数
            for (int num : numbers) std::cout << num << ' ';
            numbers.clear(); //Numbers were already printed.
        }

        letter_ready.wait();
        std::sort(letters.begin(), letters.end());

        // 若已打印数，则不做任何事。
        for (int num : numbers) std::cout << num << ' ';
        std::cout << '\n';

        for (char let : letters) std::cout << let << ' ';
        std::cout << '\n';

        value_reader.join();
    }

输出：

    -289 -23 1 2 3 4 23 42 93 93
    a a a a b c e i k k k s s

### 参阅

set_exception | 设置结果为指示异常 (公开成员函数)