C++11 promise 和 future

 通过 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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tangcpp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值