c++_std::async异步调用

c++11可以通过std::thread启动线程,也可以通过std::async来执行异步任务。std::async会返回一个std::future对象,当需要这个值的时候,需要调用这个对象的get()成员函数,并且会阻塞线程直到期望值状态变为就绪。

依赖的头文件#include <future>

std::async的启动策略:

1.std::launch::async,函数必须在其独立的线程上运行。

2.std::launch::defered,函数调用被延迟到get()或者wait()函数调用的时候才执行。

#include <iostream>
#include <future>

int do_some_thing()
{
    int nRet = 100;

    std::cout << "thread_id1:" << std::this_thread::get_id() << std::endl;
    for(int i=0;i<5;i++)
    {
        std::cout<<i<<std::endl;
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }
    return nRet;
}

#include <future>

int main()
{
    std::cout << "main_id1:" << std::this_thread::get_id() << std::endl;
    std::future<int> data = std::async(std::launch::async, do_some_thing);
    std::this_thread::sleep_for(std::chrono::seconds(6));
    //当调用get的时候,会阻塞线程,当do_some_thing执行完成后,才会输出main_id2
    //如果不调用get,会先输出main_id2,主线程继续往下走执行任务,互不干扰
    data.get();
    std::cout << "main_id2:" << std::this_thread::get_id() << std::endl;

    return 0;
}

运行结果:

从线程的id号,可发现,函数是在单独的线程中运行的。函数中的sleep5秒钟,和main函数中的sleep6秒钟是同步运行的。调用data.get()会阻塞main函数中的执行过程,等待std::async的异步函数执行完毕之后,再接着走主函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值