1.promise
promise用于异步传输变量
std::promise提供存储异步通信的值,再通过其对象创建的std::future异步获得结构。
std::promise只能使用一次。
void set_value(_Ty &&Val)设置传递值,只能用掉一次
2.future
get()阻塞等待promise的set_value的值
3.示例代码
#include <thread>
#include <iostream>
#include <future>
#include <string>
void TestFuture(std::promise<std::string> p)
{
std::cout << "begin TestFuture" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
std::cout << "begin set value" << std::endl;
p.set_value("TestFuture value");
std::this_thread::sleep_for(std::chrono::seconds(1));
std::cout << "end TestFuture" << std::endl;
}
int main()
{
std::promise<std::string> p;
auto future = p.get_future();
auto th = std::thread(TestFuture,std::move(p));
std::cout << "begin future.get()" << std::endl;
std::cout << "future get() = " << future.get() <<std::endl;
std::cout << "begin future.get()" << std::endl;
th.join();
getchar();
return 0;
}
4.packaged_task异步调用函数打包
packaged_task包装函数为一个对象,用于异步调用,其返回值能通过std::future对象访问;
与bind不同,其可异步调用,函数访问和获取返回值分开调用
#include <thread>
#include <iostream>
#include <future>
#include <string>
std::string TestPack(int index)
{
std::cout << "begin Test Pack" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(2));
return "Test Pack return"
}
int main()
{
std::packaged_task<std::string(int)> task(TestPack);
auto result = task.get_future();
std::thread th(std::move(task),101);
std::cout << "begin result get " << std::endl;
std::cout << "return get " << std::endl;
th.join();
return 0;
}
5.async创建异步线程替代thread
C++11异步运行一个函数,并返回保有其结果的std::future
launch::deferred延迟执行,再调用wait和get时,调用函数代码;
launch::async创建线程
返回的线程函数的返回值类型的std::future(std::future<线程函数的返回值类型>)
get获取结果,会阻塞等待