c++多线程编程之async、future

本文详细介绍了C++中的多线程编程,重点讲解了async和future如何用于创建后台任务并返回结果。async启动异步任务,返回包含结果的future对象,而future提供了获取异步操作结果的机制。async的launch策略可以是async(立即创建新线程)或deferred(延迟执行)。此外,还提到了packaged_task和promise,它们分别用于包装可调对象和在不同线程间传递值。最后对比了thread与async在资源紧张时的区别:thread可能会导致程序异常,而async则能灵活处理,避免直接崩溃。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

async、future创建后台任务并返回值,希望线程返回一个结果。

async是函数模板,用来启动一个异步任务,启动起来一个异步任务之后,他返回一个future对象,future是个类模板。启动一个异步任务就是自动创建一个线程并开始执行对应的线程入口函数,他返回一个future对象,这个返回的对象里边含有线程入口函数所返回的结果,我们可以通过调用future对象的成员函数get()来获取结果。future也被称为是提供了一种访问异步操作结果的机制,这个结果没有办法马上拿到,但是在线程执行完毕就可以拿到结果。get()函数不拿到返回值,就卡在哪里等待拿值。额外传递一个参数到async()中,该参数类型是launch(枚举类型),来达到一些特殊的目的。async强制异步任务在新线程上执行。

launch::deferred表示线程入口函数调用被延迟到future的wait()或者get()函数调用时才执行。如果wait()和get()没有调用,线程根本上就没创建,是在主线程中调用的线程入口函数。launch::async在调用async函数的时候就开始创建线程,async函数默认用是launch::async(异步创建新线程)|    launch::deferred(同步不创建新线程)标记,具体是哪个由程序决定。

packaged_task,是类模板,把任务包装起来,各种可调对象,通过packaged_task来把各种可调对象包装起来,方便将来作为线程入口函数来调用

  1#include<iostream>                                                                                           
  2 #include<thread>                                                                  
  3 #include<future>                                                                  
  4 using namespace std;                                                              
  5                                                                                   
  6 //线程入口函数                                                                    
  7 int mythread(int mypar){                                             
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值