C++11 异步与通信之 std::async

概念简介

std::async 异步运行一个函数,将返回值保存在std::future中。

含有2个策略参数:

  • launch::deferred 延迟执行,当调用wait()和get()时,任务才会被运行,且不创建线程
  • launch::async : 创建线程并执行任务,默认是此类型;
  • 同样的,调用get()方法获取对象时,也是阻塞等待的。

代码示例

使用deferred策略

int Func()
{
    std::cout << "Func Thread id = " << std::this_thread::get_id() << std::endl;
    return 0;
}

int main()
{   
    std::cout << "Main Thread id = " << std::this_thread::get_id() << std::endl;
    //创建延迟任务,这里不会启动新线程
    auto future = std::async(std::launch::deferred, Func);
    //调用future.get()时,才会去调用Func 
    //读者可以试着把这行代码注释掉,你会发现Func函数根本没有创建
    std::cout << "Result =  " << future.get() << std::endl;;
    //通过打印线程id我们发现,是在同一个线程中执行的,没有创建新线程
    return 0;
}

执行结果

Main Thread id = 140646835402560
Result =  Func Thread id = 140646835402560
0

使用async策略

int Func(int n)
{
    std::cout << "Func Thread id = " << std::this_thread::get_id() << std::endl;
    return -1;
}

int main()
{   
    std::cout << "Main Thread id = " << std::this_thread::get_id() << std::endl;
    //创建异步任务 使用默认策略  启动一个新线程
    //并且马上会执行异步任务代码
    auto future = std::async(std::launch::async, Func, 100);
    //通过睡眠发现,get()调用之前,任务已经在被执行了
    std::this_thread::sleep_for(std::chrono::seconds(5));
    std::cout << "Result =  " << future.get() << std::endl;;
    //通过打印线程id我们发现,不是在同一个线程中执行的,创建了新线程
    return 0;
}

运行结果:

Main Thread id = 140052716861248
Func Thread id = 140052716857088
Result =  -1

补充

std::packaged_task相比,std::async不仅可以打包一个异步任务,std::launch::async策略下还可以帮忙创建一个新线程并执行任务,某些场景下比std::packaged_task方便一些。

你可能感兴趣的:(C++2.0常用特性,c++,async,c++11,异步)