如何理解C++11标准中<future>头文件里面的类和相关函数
创始人
2024-12-25 00:02:17
0次

介绍 C++11 标准中 头文件里面的类和相关函数。

头文件中包含了以下几个类和函数:

Providers 类:std::promise, std::package_task  Futures 类:std::future, shared_future.  Providers 函数:std::async()  其他类型:std::future_error, std::future_errc, std::future_status, std::launch.

std::promise 类介绍

promise 对象可以保存某一类型 T 的值,该值可被 future 对象读取(可能在另外一个线程中),因此 promise 也提供了一种线程同步的手段。在 promise 对象构造时可以和一个共享状态(通常是std::future)相关联,并可以在相关联的共享状态(std::future)上保存一个类型为 T 的值。

可以通过 get_future 来获取与该 promise 对象相关联的 future 对象,调用该函数之后,两个对象共享相同的共享状态(shared state)

promise 对象是异步 Provider,它可以在某一时刻设置共享状态的值。  future 对象可以异步返回共享状态的值,或者在必要的情况下阻塞调用者并等待共享状态标志变为 ready,然后才能获取共享状态的值。

下面以一个简单的例子来说明上述关系

#include    // std::cout#include   // std::ref#include     // std::thread#include     // std::promise, std::futurevoid print_int(std::future& fut) {  int x = fut.get(); // 获取共享状态的值.  std::cout << "value: " << x << '\n'; // 打印 value: 10.}int main (){  std::promise prom; // 生成一个 std::promise 对象.  std::future fut = prom.get_future(); // 和 future 关联.  std::thread t(print_int, std::ref(fut)); // 将 future 交给另外一个线程t.  prom.set_value(10); // 设置共享状态的值, 此处和线程t保持同步.  t.join();  return 0;}

std::promise 构造函数

promise();

template promise (allocator_arg_t aa, const Alloc& alloc);

promise (const promise&) = delete;

promise (promise&& x) noexcept;

default (1)with allocator (2)copy [deleted] (3)move (4)

默认构造函数,初始化一个空的共享状态。  带自定义内存分配器的构造函数,与默认构造函数类似,但是使用自定义分配器来分配共享状态。  拷贝构造函数,被禁用。  移动构造函数。

另外,std::promise 的 operator= 没有拷贝语义,即 std::promise 普通的赋值操作被禁用,operator= 只有 move 语义,所以 std::promise 对象是禁止拷贝的。

例子:

#include    // std::cout#include     // std::thread#include     // std::promise, std::futurestd::promise prom;void print_global_promise () {  std::future fut = prom.get_future();  int x = fut.get();  std::cout << "value: " << x << '\n';}int main (){  std::thread th2(print_global_promise);  prom.set_value(10);  th2.join();  prom = std::promise();  // prom 被move赋值为一个新的 promise 对象.  std::thread th3 (print_global_promise);  prom.set_value (20);  th3.join(); return 0;}

std::promise::get_future 介绍

该函数返回一个与 promise 共享状态相关联的 future 。返回的 future 对象可以访问由 promise 对象设置在共享状态上的值或者某个异常对象。只能从 promise 共享状态获取一个 future 对象。在调用该函数之后,promise 对象通常会在某个时间点准备好(设置一个值或者一个异常对象),如果不设置值或者异常,promise 对象在析构时会自动地设置一个 future_error 异常(broken_promise)来设置其自身的准备状态。上面的例子中已经提到了 get_future,此处不再重复。

std::promise::set_value 介绍

void set_value (const T& val);void set_value (T&& val);

void promise::set_value (R& val);  // when T is a reference type (R&)void promise::set_value (void);  // when T is void

generic template (1)specializations (2)

设置共享状态的值,此后 promise 的共享状态标志变为 ready.

std::promise::set_exception 介绍为 promise 设置异常,此后 promise 的共享状态变标志变为 ready,例子如下,线程1从终端接收一个整数,线程2将该整数打印出来,如果线程1接收一个非整数,则为 promise 设置一个异常(failbit) ,线程2 在std::future::get 是抛出该异常。

#include    // std::cin, std::cout, std::ios#include   // std::ref#include     // std::thread#include     // std::promise, std::future#include   // std::exception, std::current_exceptionvoid get_int(std::promise& prom) {  int x;  std::cout << "Please, enter an integer value: ";  std::cin.exceptions (std::ios::failbit);  // throw on failbit  try {    std::cin >> x;             // sets failbit if input is not int    prom.set_value(x);  } catch (std::exception&) {    prom.set_exception(std::current_exception());  }}void print_int(std::future& fut) {  try {    int x = fut.get();    std::cout << "value: " << x << '\n';  } catch (std::exception& e) {    std::cout << "[exception caught: " << e.what() << "]\n";  }}int main (){  std::promise prom;  std::future fut = prom.get_future();  std::thread th2(get_int, std::ref(prom));  std::thread th3(print_int, std::ref(fut));  th2.join();  th3.join();  return 0;}

std::promise::set_value_at_thread_exit 介绍

设置共享状态的值,但是不将共享状态的标志设置为 ready,当线程退出时该 promise 对象会自动设置为 ready。如果某个 std::future 对象与该 promise 对象的共享状态相关联,并且该 future 正在调用 get,则调用 get 的线程会被阻塞,当线程退出时,调用 future::get 的线程解除阻塞,同时 get 返回 set_value_at_thread_exit 所设置的值。注意,该函数已经设置了 promise 共享状态的值,如果在线程结束之前有其他设置或者修改共享状态的值的操作,则会抛出 future_error( promise_already_satisfied )。

std::promise::swap 介绍

交换 promise 的共享状态。

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...