std::promise

定义于头文件 <future>
template< class R > class promise;
(1) (C++11 起)
template< class R > class promise<R&>;
(2) (C++11 起)
template<>          class promise<void>;
(3) (C++11 起)
1) 空模板
2) 非 void 特化,用于在线程间交流对象
3) void 特化,用于交流无状态事件

类模板 std::promise 提供存储值或异常的设施,之后通过 std::promise 对象所创建的 std::future 对象异步获得结果。

每个 promise 与共享状态关联,共享状态含有一些状态信息和可能仍未求值的结果,它求值为值(可能为 void )或求值为异常。 promise 可以对共享状态做三件事:

promise 是 promise-future 交流通道的“推”端:存储值于共享状态的操作同步于(定义于 std::memory_order )任何在共享状态上等待的函数(如 std::future::get )的成功返回。其他情况下对共享状态的共时访问可能冲突:例如, std::shared_future::get 的多个调用方必须全都是只读,或提供外部同步。

目录

成员函数

构造std::promise对象
(公开成员函数)
析构std::promise对象
(公开成员函数)
赋值共享状态
(公开成员函数)
交换二个 promise 对象
(公开成员函数)
获取结果
返回与承诺的结果关联的 future
(公开成员函数)
设置结果
设置结果为指定值
(公开成员函数)
设置结果为指定值,同时仅在线程退出时分发提醒
(公开成员函数)
设置结果为指示异常
(公开成员函数)
设置结果为指示异常,同时仅在线程退出时分发提醒
(公开成员函数)

非成员函数

特化 std::swap 算法
(函数模板)

帮助类

特化 std::uses_allocator 类型特性
(类模板特化)

示例

此示例展示能如何将 promise<int> 用作线程间信号。

#include <vector>
#include <thread>
#include <future>
#include <numeric>
#include <iostream>
#include <chrono>
 
void accumulate(std::vector<int>::iterator first,
                std::vector<int>::iterator last,
                std::promise<int> accumulate_promise)
{
    int sum = std::accumulate(first, last, 0);
    accumulate_promise.set_value(sum);  // 提醒 future
}
 
void do_work(std::promise<void> barrier)
{
    std::this_thread::sleep_for(std::chrono::seconds(1));
    barrier.set_value();
}
 
int main()
{
    // 演示用 promise<int> 在线程间传递结果。
    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::thread work_thread(accumulate, numbers.begin(), numbers.end(),
                            std::move(accumulate_promise));
    accumulate_future.wait();  // 等待结果
    std::cout << "result=" << accumulate_future.get() << '\n';
    work_thread.join();  // wait for thread completion
 
    // 演示用 promise<void> 在线程间对状态发信号
    std::promise<void> barrier;
    std::future<void> barrier_future = barrier.get_future();
    std::thread new_work_thread(do_work, std::move(barrier));
    barrier_future.wait();
    new_work_thread.join();
}

输出:

result=21

版本历史

  • (当前 | 先前 2017年9月25日 (一) 00:17Fruderica讨论 | 贡献 . . (4,038字节) (-3). . (wording) (撤销)
  • 当前 | 先前 2017年9月24日 (日) 10:55Fruderica讨论 | 贡献. . (4,041字节) (+2,574). . (撤销)
  • 当前 | 先前 2017年9月16日 (六) 04:582001:da8:8000:e082::9933讨论. . (1,467字节) (-277). . (将英文版本人工翻译为中文) (撤销)
  • 当前 | 先前 2013年7月2日 (二) 11:33P12bot讨论 | 贡献 . . (1,744字节) (-299). . (Use {{lc}}. Update links. Various fixes.) (撤销)
  • 当前 | 先前 2012年11月2日 (五) 19:18P12bot讨论 | 贡献 . . (2,043字节) (+209). . (r2.7.3) (机器人添加:de, en, es, fr, it, ja, pt, ru) (撤销)
  • 当前 | 先前 2012年10月26日 (五) 03:08P12讨论 | 贡献 . . (1,834字节) (0). . (1个修订: Translate from the English version) (撤销)
  • 当前 | 先前) 2012年10月25日 (四) 12:00TranslationBot讨论 | 贡献. . (1,834字节) (+1,834). . (Translated from the English version using Google Translate)