通过 promise 和 future 可以实现跨线程等待异步操作结果。
如在线程2等到线程1的某个执行结果之后线程2才允许往下执行。
#include <iostream>
#include <future>
#include <chrono>
#include <string>
#include<functional>
#include <queue>
void thread_fun1(std::promise<int>& p)
{
std::cout << "thread_fun1 begin \n" << std::endl;
int val = 233;
std::cout << "传入数据:" << val << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(3)); //为了突出效果,使线程休眠5s
//传入数据val
p.set_value(val);
std::cout << "thread_fun1 end \n" << std::endl;
}
void thread_fun2(std::future<int>& f)
{
std::cout << "thread_fun2 begin \n" << std::endl;
auto val = f.get(); //阻塞函数,直到收到相关联的std::promise对象传入的数据 val = 233
std::cout << "收到数据:" << val << std::endl;
}
void test_promise()
{
//声明一个std::promise对象pr1,其保存的值类型为int
std::promise<int> pr1;
//声明一个std::future对象fu1,并通过std::promise的get_future()函数与pr1绑定
std::future<int> fu1 = pr1.get_future();
//创建一个线程t1,将函数thread_fun1及对象pr1放在线程里面执行
std::thread t1(thread_fun1, std::ref(pr1));
//创建一个线程t2,将函数thread_fun2及对象fu1放在线程里面执行
std::thread t2(thread_fun2, std::ref(fu1));
t1.join();
t2.join();
std::packaged_task <int()> task([]()->int {
std::cout << "packaged_task begin \n" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(3));
std::cout << "packaged_task end \n" << std::endl;
return 0;
});
std::future<int> fret = task.get_future();
std::thread t3(std::move(task));
int ret = fret.get();
std::cout << "packaged_task ret:" << ret << std::endl;
t3.join();
}
int main()
{
test_promise();
return 0;
}