首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我是否必须调用get或等待std::async将来

根据问答内容,你是否必须调用get或等待std::async将来,取决于你对于异步任务的需求和编程上下文。

首先,让我们了解一下相关的概念和术语:

  1. 异步任务(asynchronous task):在编程中,异步任务是指可以在后台执行而不会阻塞主线程或当前执行流程的任务。通常用于处理耗时的操作,如网络请求、文件读写等。
  2. std::async:std::async是C++标准库中的一个函数模板,用于创建异步任务并返回一个std::future对象,该对象可以用于获取异步任务的结果。

在使用std::async创建异步任务时,可以根据需求选择是否调用get或等待将来。下面是两种情况的解释:

情况一:不需要获取异步任务的结果 如果你创建的异步任务不需要获取其返回值,或者对任务的返回值不感兴趣,那么你可以选择不调用get或等待将来。这种情况下,异步任务将会在后台独立执行,不会阻塞主线程或当前执行流程。这种方式适用于那些只关注任务执行过程而不需要返回值的场景,例如并行执行多个任务,或者任务间存在依赖关系但不需要等待其结果。

情况二:需要获取异步任务的结果 如果你创建的异步任务需要获取其返回值,并且需要确保在获取返回值之前任务已经执行完毕,那么你需要调用get或等待将来。调用get将会阻塞当前线程,直到异步任务执行完毕并返回结果。等待将来则是另一种等待异步任务执行完毕的方式,可以通过std::future对象的wait方法实现。

需要注意的是,在使用get或等待将来时,如果异步任务抛出了异常,异常将会在调用get或等待将来的地方重新抛出,因此你可能需要适当地处理异常。

腾讯云相关产品和产品介绍链接地址:

腾讯云提供了一系列与云计算相关的产品,包括但不限于:

  1. 云服务器(Elastic Cloud Server,ECS):腾讯云的云服务器产品,提供弹性计算能力,适用于各种业务场景。详细介绍请参考:腾讯云云服务器产品介绍
  2. 云数据库(TencentDB):腾讯云的云数据库产品,提供多种数据库引擎和类型,包括关系型数据库、分布式数据库、缓存数据库等。详细介绍请参考:腾讯云云数据库产品介绍
  3. 人工智能(AI):腾讯云的人工智能服务,包括语音识别、图像识别、自然语言处理等功能。详细介绍请参考:腾讯云人工智能产品介绍
  4. 物联网(IoT):腾讯云的物联网平台,提供物联网设备接入、数据管理、规则引擎等功能。详细介绍请参考:腾讯云物联网产品介绍

需要注意的是,以上只是腾讯云的部分产品示例,腾讯云还提供其他云计算相关的产品和服务,具体信息可以参考腾讯云官方网站。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

来聊聊C++中头疼的线程、并发

detach():传统多线程,主线程要等待子线程执行完毕,然后自己再最后退出, detach分离,也就是主线程和子线程不汇合了,各自独立执行,主线程执行完了,不影响子线程。为什么引入detach?...如果wait()或者get()没有调用则不会执行线程. eg: std::async(std::launch::deferred,my_thread)可以测试线程id,延迟调用,其实没有创建新线程,是在主线程中调用的线程入口函数.... std::launch::async调用async函数时,就开始创建线程 async函数默认用的就是std::launch::async标记 #include #include...; //卡在这里等待mythrea()执行完毕,拿到结果 // res.get()只能调用一次!!...它是一个类模板,它的模板参数是各种可调用对象,通过std::package_task把各种可调用对象包装起来,方便将来作为线程入口函数调用

5K41
  • C++基础 多线程笔记(二)

    采用加锁机制,保证两个子线程互斥,并且消费者线程使用循环查询机制,不断检查是否有可用数据。....get()成员函数等待子线程返回结果,否则一直等待(注:只能get一次,多次调用则报异常) 与之类似的.wait()成员函数只等待结果,不获取结果(类似于join()) 如果.get()和 .wait...()都不用,主程序结束时仍等待子线程 future:理解为提供了一种访问异步操作结果的机制,即需要等待一段时间(线程执行完毕) 主线程才能从 子线程 中拿到结果 额外向async()传递一个参数(std...::launch枚举类型),实现其它功能 std::launch::deffered:表示线程入口函数被延迟到get()wait()时才执行(但仍是主线程,没有新线程!)...,若没有get()wait()则始终不执行子线程 std::launch::async:立即创建一个新线程 std::launch::async|std::launch::deffered:根据系统资源消耗情况

    52610

    C++并发编程 - 同步并发操作

    之后,这个线程会周期性(较短的周期)的等待检查,事件是否触发(检查信息板); 在检查期间也会执行其他任务。...一般情况下,std::async()任务函数默认情况下在创建时启动,在调用f4.get()时,若线程未执行完,则阻塞至执行完;否则,立刻返回结果(主线程sleep(2)是否注释,后两条打印都相差2s)。...wait()get()函数调用时才执行 std::launch::async: 函数必须在其 所在的独立线程上执行 std::launch::deferred | std::launch::async...:launch::deferred, func, std::ref(x)); // 在wait()get()调用时执行 auto f8=std::async( std::launch:...而std::async则不会,它在无法创建新线程时,会将任务分配给后续调用future.get()函数的线程,并以同步的方式执行(即不创建新线程)。

    1.1K40

    再也不用std::thread编写多线程了

    所返回的期望值的get * wait得到调用时才运行,也就是,执行会推迟到其中一个调用发生的时刻。...当调用getwait时 * ,f会同步运行,也就是,调用方会阻塞至 f运行结束为止。...如果 getwait都没有得到调用,f是不会运行的 * * 3,如果你不积极指定一个,std::async采用的并非以上两者中的一个,相反地,它采用的是对二者进行运算的结果 * * @return...,因为 f 可能会被调度为推迟运行 * * 2,无法预知f是否运行在与调用 fut的getwait函数的线程不同的某线程之上。...如果那个线程是t,那就是说无法预知f是否运行 * 在与t不同的某线程之上 * * 3,连f是否允许这件起码的事情都是无法预知的,这个因为无法保证在程序的每条路径上,fut的getwait都会得到调用

    2.4K40

    【Example】C++ 标准库多线程同步及数据共享 (std::future 与 std::promise)

    (类型由模板类型而定) valid() 检查 future 是否处于被使用状态,也就是它被首次在首次调用 get()  share() 前。 wait() 阻塞等待调用它的线程到共享值成功返回。...:async 返回的 std::future 首次调用非定时等待函数后,再去执行。...,除了若 f 返回值抛出异常,则于可通过 async 返回给调用方的 std::future 访问的共享状态存储结果。...而是进行惰性求值:在 async 所返回的 std::future 上首次调用非定时等待函数,将导致在当前线程(不必是最初调用 std::async 的线程)中,以 args... ...若选择 async 策略,则关联线程的完成同步于首个等待于共享状态上的函数的成功返回,最后一个释放共享状态的函数的返回,两者的先到来者。 完工!

    1.5K30

    学习C++,必须学习的线程知识点

    std::once_flag 是一个用于标记是否已经执行过某个函数的标志。...等待和唤醒: 线程可以调用 wait() 函数在条件变量上等待,当其他线程调用 notify_one() notify_all() 函数时,等待的线程将被唤醒。...std::future 表示一个可能会在将来完成的操作的结果,允许程序在等待异步操作完成时继续执行其他任务。...如果异步操作尚未完成,调用 get() 函数将会阻塞当前线程,直到异步操作完成并返回结果。 等待操作完成: 可以使用 wait() 函数等待异步操作完成。...std::launch::async 策略表示在新线程或者线程池中执行任务,std::launch::deferred 策略表示延迟执行任务直到调用 get() 函数时,而默认策略由编译器决定。

    27610

    C++一分钟之-未来与承诺:std::future与std::promise

    一旦关联的任务完成,你可以通过future对象获取等待这个结果。它就像是一个装着未来结果的容器,你可以选择阻塞等待结果,或者检查结果是否已准备好。...3.2 多重获取std::future的结果只能获取一次。尝试再次调用get()会导致未定义行为。3.3 错误的线程同步在多线程环境下,没有正确同步对std::promise的访问可能导致数据竞争。...3.4 忘记检查std::future的状态直接调用get()而不先检查is_ready()状态,可能会导致当前线程阻塞,特别是在结果还未准备好时。...4.2 明确获取结果的时机使用std::future::wait_for()std::future::wait_until()来控制等待时间,避免无限期阻塞。...4.4 检查未来状态在调用get()之前,先检查std::future::valid()和std::future::wait_for(),确保操作的安全性。

    52010

    【C++11】std::async函数介绍及问题梳理

    (延迟执行,在调用 std::future::get() std::future::wait() 时执行)。...可以是零个多个参数。 这个函数的作用是根据给定的执行策略异步执行函数 f,并返回一个 std::future 对象,可用来等待函数的执行完成并获取函数的结果。...注意: std::async 的行为受到执行策略参数【 std::launch 类型的参数】的影响,可能在调用时立即执行,也可能延迟到 std::future::get() std::future:...所以这里重载了new并且使用全局变量simulate_allocation_failure控制调用new是否能够成功。...然后调用 future.get() 等待异步任务完成,并获取其结果。如果异步任务中抛出了异常,future.get() 函数会在主线程中抛出相同的异常。

    49310

    C++并发低级接口:std::thread和std::promise

    std::thread和std::promise 相比std::async,std::thread就原始多了。...thread一定会创建新线程(而不是像async那样创建的时候可能不会,后面才创建新线程(std::launch::deferred)),并且创建它的线程还必须指定以何种策略等待新线程。...创建新线程异步输出"A",然后主线程输出"B",td.join()就是所谓的创建它的线程还必须指定以何种策略等待新线程,有两种策略可供选择: std::thread.join() 阻塞直到子线程结束 std...这里也凸显了std::async的高级和std::thread的低级:在std::async中我们可以对它的返回值即std::future简单的调用get()实现同步等待甚至能获取任务的结果,但是std...不过《C++标准库》中这样分类,加之std::future,std::promise分别用于std::asyncstd::thread的示例,也只能照做了;)

    2.3K40

    《C++并发编程实战》读书笔记(2):并发操作的同步

    第4章 并发操作的同步 4.1 等待事件等待其他条件 如果线程甲需要等待线程乙完成任务,可以使用C++标准库的条件变量来等待事件发生。...例如可以实现一个生产者消费者模型,通过队列来传递数据,一端准备数据另一端处理数据,其中条件变量的作用是消费者线程取出数据前检查队列是否非空,否则释放锁并等待生产者线程准备数据。...---- 4.2.1 从后台任务返回值 并不急需某任务的返回值时,可以用async异步地启动任务,获得一个future对象;对后者调用get会阻塞当前线程,等待future准备完并返回该值。...f5 = std::async(baz, std::ref(x)); 可以给async传递参数指定运行方式,deferred代表直到在future上调用wait/get才执行任务函数,async...限时等待 之前介绍的所有可能阻塞的调用,其阻塞都可能漫无止境。

    36720

    UNIX(多线程):19---Future 类型详解

    对象调用 get(通常在另外一个线程中) 获取该值,如果共享状态的标志不为 ready,则调用 std::future::get 会阻塞当前的调用者,直到 Provider 设置了共享状态的值(此时共享状态的标志变为...ready),std::future::get 返回异步任务的值异常(如果发生了异常)。...在一个有效的 future 对象上调用 get 会阻塞当前的调用者,直到 Provider 设置了共享状态的值异常(此时共享状态的标志变为 ready),std::future::get 将返回异步任务的值异常...后,调用该函数将返回保存在共享状态中的值,如果共享状态的标志不为 ready,则调用该函数会阻塞当前的调用者,而此后一旦共享状态的标志变为 ready,get 返回 Provider 所设置的共享状态的值或者异常...:valid() 检查当前的 std::future 对象是否有效,即释放与某个共享状态相关联。

    59420

    【译文】Rust futures: async fn中的thread::sleep和阻塞调用

    如果不确定, 鉴于Rust std库中几乎所有都是阻塞的,所以就要注意哪些调用是耗时的! 虽然认为任何人都可能犯这个错误(在引入足够的负载来显著地阻塞线程之前,往往察觉不到),但是初学者尤为如此。...你必须多次运行该程序,才能查看日志记录顺序是否可以翻转(如果不翻转怎么办?)。...如果想看到get_book和get_music是100%同时运行,你可能会想到记录它们的开始时间,并查看开始时间是否相同。...为什么async不行? 不会在这里深入讨论futures和async/await(本书是一个很好的起点)。只想指出造成困惑的两个可能的根源: std::thread::sleep 会阻塞?...为了理解那些在线讨论,(就要知道)他们的想法是以为async可以使代码块函数内部的所有内容异步。 首先,想说这是有意义的;async/await存在的部分原因是它使每个人都容易进行异步操作。

    3K20

    跟面试官刚同步异步编程,有她完全够用了

    而是在调用发出后,被调用者通过状态,通知调用者,通过回调函数处理这个调用。 3,线程同步和异步主要解决了什么问题?...异步:主要针对任务线程的执行顺序,也即一个任务不需要阻塞等待上一个任务执行完成后再开始执行,程序的执行顺序与任务的排列顺序是不一致的。.../阻塞等待线程执行完成 getchar(); return 0; } 改进版: //使用async传递被调用线程返回结果 #include #include <thread...;//defered是在当前线程中同步执行 请注意 并不是立即执行 而是延后到get函数被调用的时候才执行 // Calls X()(43); with async policy //...std::cout << a3.get() << '\n'; // prints "53" } async很好用呢?

    54520

    每个C++工程师都要了解的十个性能陷阱

    (四)滥用 std::shared_ptr C++核心指南是这样推荐智能指针的用法的: 用 std::unique_ptr std::shared_ptr表达资源的所有权。...能想到的必须std::shared_ptr 的场景有:异步析构,缓存。除此之外想不出任何必须的场景,欢迎小伙伴们在评论区补充。...(七)std::async std::async 是一个很好用的异步执行抽象,但是在使用的时候可能一不小心,你的代码就变成了同步调用: 不指定 policy std::async 的接口是: template...因为 std::async 会返回一个 std::future,而这个 std::future 在析构时,会同步等待函数返回结果才析构结束。这也是上文“隐形的析构”的另外一种表现。...::async, func2); 更奇葩的是,只有 std::async 返回的 std::future 在析构时会同步等待std::packaged_task,std::promise 构造的 std

    1.7K41

    10大性能陷阱!每个C++工程师都要知道

    (四)滥用std::shared_ptr C++核心指南是这样推荐智能指针的用法的: 用 std::unique_ptr std::shared_ptr表达资源的所有权。...能想到的必须std::shared_ptr的场景有:异步析构,缓存。除此之外想不出任何必须的场景,欢迎小伙伴们在评论区补充。...(七)std::async std::async是一个很好用的异步执行抽象,但是在使用的时候可能一不小心,你的代码就变成了同步调用: 不指定policy std::async的接口是: template...因为std::async会返回一个std::future,而这个std::future在析构时,会同步等待函数返回结果才析构结束。这也是上文“隐形的析构”的另外一种表现。...正确的代码应当长这样: 更奇葩的是,只有std::async返回的std::future在析构时会同步等待std::packaged_task,std::promise构造的std::future都不会同步等待

    1.1K30

    Chapter 7: The Concurrency API

    std::async的底层机制 如果当前申请的线程已经超过系统能够提供的线程数量时,调用std::thread和std::async有什么区别呢?...调用std::async并不保证会创建一个新的软件线程,而是它允许调度器把新线程要执行的函数放在当前线程上运行,当前线程是请求新线程并等待执行结果的线程,那么当系统过载或者线程资源不够时,合理的调度器会利用自由方式来解决这些问题...这种机制保证函数运行在一个不同的线程中 std::launch::deferred 启动机制,这种机制使得当std::async返回的future对象调用get或者wait时,异步函数才会被执行。...,也可以异步运行,这样做是为了允许标准库对线程的管理做优化(处理过载,资源不够,负载不均衡的情况) std::async的默认启动机制会有一些有趣的含义 无法预测异步函数是否和当前线程并发执行 无法预测异步函数是否执行在新的线程上还是执行在当前线程上...可能也无法预测异步函数是否运行了 以上这些含义使得默认启动机制不能很好地和线程局部变量混用,因为无法预测异步函数所在线程什么时候会执行,也不知道会修改哪些线程局部变量;除此之外,那些使用超时的等待机制循环也会受到影响

    90250
    领券