future头文件
future头文件提供了这样一种便利,允许异步访问一个被一个特定的提供者设置的值,提供者和访问者可以在不同的线程,它会保证不同线程之间的同步。
访问者可以通过提供者(比如说promise)提供的future对象来访问共享状态(值)。
<future>头文件包含了以下几个类和函数
- Provider类:std::promise, std::package_task
- Future类 : std::future, shared_future
- Provider函数:std::async()
- 其他
std::future
future对象可以从其他一些提供者对象或者函数获取一个值。
合法(valid)的futures是一些关联了共享状态的future对象,可以通过如下函数来获取。
- async
- promise::get_future
- packaged_task::get_future
记住只有合法的future对象才是有用的,使用默认构造函数创建的future对象不是合法的(除非通过转移赋值的方式把一个合法的future对象赋值给它了),也就是说直接定义的future对象没有用。
一个合法的future对象的future::get函数会block线程,等待提供者吧共享状态置成ready。
共享状态的生命周期会一直延续到和它相关的最后一个对象被释放或者销毁了为止。
std::promise
promise是一个模板类,下面是它的三个声明
template <class T> promise;
template <class R&> promise<R&>; //T是引用类型
template <> promise<void> // T 是一个void类型
promise这个对象保存了一个类型为T的值,这个值可以通过future对象来获取(这个获取的过程可能在另一个线程中发生),这个类提供了一种同步机制。
#include <iostream>
#include <functional> //std::ref
#include <thread>
#include <future>
void print_int(std::future<int>& fut)
{
int x = fut.get(); // 如果共享状态没有ready,线程会阻塞在这里,知道监测到状态ready了
std::cout << "value: " << x << std::endl;
}
int main()
{
std::promise<int> prom;
std::future<int> fut = prom.get_future(); // 返回的future对象和promise对象共享状态相关联
std::thread th1 (print_int, std::ref(fut)); // 通过引用的方式传递future对象给新创建的线程
prom.set_value(10); // set_value设置共享状态,并且promise的共享状态标志变成ready
th1.join();
return 0;
}