当前位置: 代码迷 >> 综合 >> C++11----多线程之std::future, std::promise
  详细解决方案

C++11----多线程之std::future, std::promise

热度:44   发布时间:2024-01-04 02:11:38.0

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;
}

  相关解决方案