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

 更新时间:2023年08月15日 09:25:27   作者:KingOfMyHeart  
std::async 异步运行一个函数,将返回值保存在std::future中,本文主要介绍了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++11异步与通信之std::async的使用的文章就介绍到这了,更多相关C++11  std::async内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于C语言实现简单的五子棋游戏

    基于C语言实现简单的五子棋游戏

    这篇文章主要为大家详细介绍了基于C语言实现简单的五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • c++中的字节序与符号位的问题

    c++中的字节序与符号位的问题

    这篇文章主要介绍了c++中的字节序与符号位的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • C++中map和vector作形参时如何给定默认参数?

    C++中map和vector作形参时如何给定默认参数?

    今天小编就为大家分享一篇关于C++中map和vector作形参时如何给定默认参数?,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • C++实现获取时间戳和计算运行时长

    C++实现获取时间戳和计算运行时长

    这篇文章主要为大家详细介绍了如何使用C++实现获取时间戳和计算运行时长功能,文中的示例代码讲解详细,有需要的小伙伴可以参考一下
    2024-12-12
  • C++单例模式的实例详解

    C++单例模式的实例详解

    这篇文章主要介绍了C++单例模式的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握这部分内容,需要的朋友可以参考下
    2017-10-10
  • C语言关键字const和指针的结合使用

    C语言关键字const和指针的结合使用

    这篇文章主要介绍了C语言关键字const和指针的结合,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • C/C++ 引用作为函数的返回值方式

    C/C++ 引用作为函数的返回值方式

    这篇文章主要介绍了C/C++ 引用作为函数的返回值方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • C++报错:Segmentation Fault的解决方案

    C++报错:Segmentation Fault的解决方案

    段错误(Segmentation Fault)是 C++ 编程中常见且令人头疼的错误之一,段错误通常发生在程序试图访问未被允许的内存区域时,导致程序崩溃,本文将深入探讨段错误的产生原因、检测方法及其预防和解决方案,需要的朋友可以参考下
    2024-07-07
  • 编译错误error: stray ‘\343’in program的解决方法

    编译错误error: stray ‘\343’in program的解决方法

    以下是对编译错误error: stray ‘\343’in program的解决方法进行了详细的分析介绍,如遇此问题的朋友们可以过来参考下
    2013-07-07
  • C语言中结构体(struct)的几种初始化方法

    C语言中结构体(struct)的几种初始化方法

    相信大家都知道struct结构体是C语言中非常重要的复合类型,初始化的方法很多,那么小编下面对这些方法进行总结,便于自己和大家以后查阅,有需要的可以参考借鉴。
    2016-08-08

最新评论