std::future,是一个类模板,它存储着一个未来的值。
那问题来了,未来的值是什么鬼?
实际上一个std::future对象里存储着一个在未来会被赋值的变量,这个变量可以通过std::future提供的成员函数std::future::get()来得到。如果在这个变量被赋值之前就有别的线程试图通过std::future::get()获取这个变量,那么这个线程将会被阻塞到这个变量可以获取为止。
std::promise同样也是一个类模板,它的对象承诺会在未来设置变量(这个变量也就是std::future中的变量)。每一个std::promise对象都有一个与之关联的std::future对象。当std::promise设置值的时候,这个值就会赋给std::future中的对象了。
#include<iostream> //std::cout std::endl
#include<thread> //std::thread
#include<future> //std::future std::promise
#include<utility> //std::ref
#include<chrono> //std::chrono::secondsvoid initiazer(std::promise<int> &promiseObj)
{std::cout << "Inside thread: " << std::this_thread::get_id() << std::endl;std::this_thread::sleep_for(std::chrono::seconds(1));//模拟计算时间promiseObj.set_value(35);//得到结果35
}int main() {std::promise<int> promiseObj;std::future<int> futureObj = promiseObj.get_future();std::thread th(initiazer, std::ref(promiseObj));//std::ref是让按值传参的模板可以接受一个引用作为参数,否则依然是值传递。std::cout << futureObj.get() << std::endl;//尝试获取结果,如果结果还没有被设置的话,会组阻塞当前线程。th.join();return 0;
}