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

在std::async调用内部时,并非所有std::packaged_tasks都会执行

。std::async是C++11标准库中的一个函数,用于实现异步任务的执行。它接受一个可调用对象(函数、函数指针、成员函数指针、lambda表达式等)作为参数,并返回一个std::future对象,用于获取异步任务的结果。

在std::async内部,它会根据系统的资源情况和调用方式,决定是否创建一个新的线程来执行异步任务。如果创建了新线程,那么std::async会将传入的可调用对象封装成一个std::packaged_task,并将其提交给新线程执行。而如果没有创建新线程,std::async会在当前线程中执行可调用对象。

然而,并非所有的std::packaged_tasks都会被执行。这是因为std::async有一个策略参数,用于指定异步任务的执行方式。策略参数有三种取值:std::launch::async、std::launch::deferred和std::launch::any。

  • std::launch::async表示异步任务应该在新线程中执行。如果使用了这个策略参数,那么std::async会创建一个新线程,并将std::packaged_task提交给新线程执行。
  • std::launch::deferred表示异步任务应该在调用std::future的get()或wait()函数时执行。如果使用了这个策略参数,那么std::async不会创建新线程,而是将std::packaged_task延迟到std::future的get()或wait()函数被调用时执行。
  • std::launch::any表示异步任务的执行方式由系统决定。如果使用了这个策略参数,那么std::async会根据系统的资源情况和调用方式来决定是否创建新线程执行异步任务。

因此,当std::async的策略参数为std::launch::deferred时,std::packaged_task并不会立即执行,而是在调用std::future的get()或wait()函数时执行。而当策略参数为std::launch::async或std::launch::any时,std::packaged_task会被提交给新线程或由系统决定是否创建新线程执行。

总结起来,std::async调用内部时,并非所有std::packaged_tasks都会执行,这取决于std::async的策略参数。如果策略参数为std::launch::deferred,std::packaged_task会延迟执行;如果策略参数为std::launch::async或std::launch::any,std::packaged_task会被提交给新线程或由系统决定是否创建新线程执行。

腾讯云相关产品推荐:

  • 云服务器(Elastic Cloud Server,ECS):https://cloud.tencent.com/product/cvm
  • 云函数(Serverless Cloud Function,SCF):https://cloud.tencent.com/product/scf
  • 云数据库 MySQL 版(TencentDB for MySQL):https://cloud.tencent.com/product/cdb_mysql
  • 人工智能平台(AI Platform):https://cloud.tencent.com/product/ai
  • 云存储(Cloud Object Storage,COS):https://cloud.tencent.com/product/cos
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

如果 get或wait都没有得到调用,f是不会运行的 * * 3,如果你不积极指定一个,std::async采用的并非以上两者中的一个,相反地,它采用的是对二者进行或运算的结果 * * @return...才创建的 * * 2,该任务的启动策略是 std::launch::async,这既可能是运行时系统的选择,也可能是调用std::async指定的 * * 3,该期望是指涉到该共享状态的最后一个期望...(name + "jenne");//调addName传入右值,对newName实施的是移动构造 //分析以上三种方法的成本问题 /*** * 1,重载 * :无论传入左值还是右值,调用方的实参都会绑定到名字为...而这样做不会在复制或移动带来任何成本 * 内部实现是,对于左值是一次复制,对于右值是一次移动 * * 2,使我万能引用 * ,调用方的实参会绑定到引用 newName 上。..., * 因为作为右值引用的x,复制之前被转换成了右值) * * 3,最后 push_back返回的那一刻,tmp被析构,所有,这就需要调用一次std::string的析构函数 */ //因此,有没有办法将字符串字面量直接传递给步骤

2.4K40

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

::launch::async std::async 初始化所有线程局域对象后执行调用对象。...std::launch::deferred 是 std::async 初始化后(期间完成内部std::thread对象创建),不执行调用对象(内部std::thread也没有被初始化), std:...= 0 ),则 async 新的执行线程(初始化所有线程局域对象后)执行调用对象 f ,如同产出 std::thread(std::forward(f), std::forward...而是进行惰性求值: async 所返回的 std::future 上首次调用非定时等待函数,将导致在当前线程(不必是最初调用 std::async 的线程)中,以 args... ...(作为右值传递)的副本调用 f (亦作为右值)的副本。将结果或异常置于关联到该 future 的共享状态,然后才令它就绪。对同一 std::future 的所有后续访问都会立即返回结果。

1.5K30
  • Boost asio 官方教程

    相反,Boost.Asio 会在任务完成触发一个应用。 异步任务的主要优点在于,等待任务完成不需要阻塞应用程序,可以去执行其它任务。 异步任务的典型例子是网络应用。...一旦闹钟时间到,作为参数所提供的函数就会被相应调用。 因此,应用程序可以调用async_wait() 之后执行其它操作,而不是阻塞在这里。...每一段指定时长过去后,都会相应地调用函数 handler1() 和 handler2()。 main() 的最后,再次唯一的 I/O 服务之上调用了 run() 方法。...调用async_connect() 方法之后,connect_handler() 会被自动调用该句柄的内部,会访问 ec 对象以检查连接是否已建立。...然后,在用于执行这个内部 I/O 服务的 run() 方法的线程内,调用该函数对象的重载 operator()()。 post() 提供了一个简单的方法,另一个线程中执行一个函数对象。

    17.6K71

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

    注: 以上两段描述,摘抄于《C++并发编程实战》   std::future并非单独使用,C++标准库std::asyncstd::packaged_task和std::promise关联了std:...std::async 带返回值的后台任务   当需要执行一个耗时的任务,不阻塞主线程的条件下,还需要关心这个任务执行的结果(例如是获取计算结果)。...一般情况下,std::async()任务函数默认情况下在创建启动,调用f4.get(),若线程未执行完,则阻塞至执行完;否则,立刻返回结果(主线程sleep(2)是否注释,后两条打印都相差2s)。...指定async任务执行时机   std::async()任务执行时机可在创建传入额外参数指定,这个参数的类型是std::launch,有以下含义: std::launch::deferred: 函数调用被延迟到...而std::async则不会,它在无法创建新线程,会将任务分配给后续调用future.get()函数的线程,并以同步的方式执行(即不创建新线程)。

    1.1K40

    Chapter 7: The Concurrency API

    Software threads 系统线程,是操作系统管理的所有进程内部的线程,操作系统把它们调度到硬件线程上来执行任务 std::threads 一个C++进程内的对象,是底层软件线程的句柄...std::async的底层机制 如果当前申请的线程已经超过系统能够提供的线程数量调用std::thread和std::async有什么区别呢?...调用std::async并不保证会创建一个新的软件线程,而是它允许调度器把新线程要执行的函数放在当前线程上运行,当前线程是请求新线程并等待执行结果的线程,那么当系统过载或者线程资源不够,合理的调度器会利用自由方式来解决这些问题...这种机制保证函数运行在一个不同的线程中 std::launch::deferred 启动机制,这种机制使得当std::async返回的future对象调用了get或者wait,异步函数才会被执行。...//并发执行其他任务 } ... } 使用默认启动机制的std::async,需要满足以下条件 任务不需要与调用线程并发运行 与线程局部变量的读写无关 要么保证std::async

    90050

    Rust也出2077? 最受欢迎的编程语言再度更新!

    不管Edition如何,所有 Rust代码最终都会在编译器中编译为相同的内部 IR。 Edition的迁移也几乎是全自动的。发布新Edition的同时,会附带一个自动迁移工具。...例如,当迁移到Rust 2018所有的「async都会变为:「r#async」。...例如,使用「MyTryInto」特征调用「x.try_into()」,如果还导入了「std」的「TryInto」,则会出现无法编译的情况,因为它提供了具有相同名称的方法。...()」和「std::panic!()」将会是等效的。目前,这两者之间存在一些差异,尤其是开启或关闭「#![no_std]」 。...这个改动会对「macro_rules」宏产生影响,于是1.53.0中「:pat」并不与「|」相匹配。因为之前,并非所有嵌套级别都可以包含「|」。

    79830

    c++11新特性之线程相关所有知识点

    三者之间的关系 std::future用于访问异步操作的结果,而std::promise和std::packaged_taskfuture高一层,它们内部都有一个future,promise包装的是一个值...::async表示任务执行在另一线程 std::launch::deferred表示延迟执行任务,调用get或者wait才会执行,不会创建线程,惰性执行在当前线程。...• 有时候我们如果想真正执行异步操作可以对async进行封装,强制使用std::launch::async策略来调用async。 template <typename F, typename......• std::atomic提供了原子变量,更方便实现实现保护,不需要使用互斥量 • std::call_once保证函数多线程环境下只调用一次,可用于实现单例。...• async更方便的实现了异步调用,异步调用优先使用async取代创建线程。

    59920

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

    将不同任务分配到不同线程执行,并且通过手动/自动方式,解决不同Task之间资源依赖关系。通俗解释如下: 同步:程序发出一个调用时,没有得到结果之前,该调用就不返回。...但是一旦调用返回,就得到返回值了。 异步:程序发出调用之后,这个调用就直接返回了,所有没有返回结果。而是调用发出后,被调用者通过状态,通知调用者,或通过回调函数处理这个调用。...函数等 这些函数并不是 package_task构造执行 需要手动 invoke才能执行 std::future result = task.get_future();//从中获得...=" << accumulate_future.get() << '\n'; //std::async能在很大程度上简少编程工作量,使我们不用关注线程创建内部细节,就能方便的获取异步执行状态和结果...(future与shared_future),std::async能在很大程度上简少编程工作量,使我们不用关注线程创建内部细节,就能方便的获取异步执行状态和结果,还可以指定线程创建策略。

    53920

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

    如果不确定, 鉴于Rust std库中几乎所有都是阻塞的,所以就要注意哪些调用是耗时的! 虽然我认为任何人都可能犯这个错误(引入足够的负载来显著地阻塞线程之前,往往察觉不到),但是初学者尤为如此。...下面的场景可能有点冗长,但我认为有必要展示一下async fn中实现阻塞调用是多么容易。...你已经读了这篇文章的标题,可能会猜到get_book和get_music是按顺序执行的。但为什么!?异步fn中的所有内容不是都应该同时运行吗?...对于新手来说,std::thread::sleep会造成阻塞可能并不是显而易见的。尽管事后看起来很明显,但是当尝试掌握全新的程序执行范式,却很容易忽略。...为了理解那些在线讨论,(就要知道)他们的想法是以为async可以使代码块或函数内部所有内容异步。 首先,我想说这是有意义的;async/await存在的部分原因是它使每个人都容易进行异步操作。

    2.9K20

    【C++11】 让多线程开发变得简单--异步操作

    通过查询future状态获取结果,future由三种状态组成,分别是: Deferred:异步操作还没开始 Ready:异步操作已经完成 Timeout:异步操作超时 实际编码中,可以通过判断这三种内部状态异步获取执行结果...0; } 程序运行结果为:iRes=5 2 异步操作函数:async 相对前面的异步操作类,std::async要高级的多,且可以直接创建异步的task类,异步返回结果保存在future中,获取线程函数返回结果...: 调用async后就开始启动线程 launch::deferred:延迟启动线程,等到后面调用了wait、get启动线程。...\n"; return 0; } 上面代码的运行如果为: checking, please wait "\n444444443 is prime." async是更高层次的异步操作,实际编码无需关注线程创建细节...,就可以方便的获取线程执行状态和结果;一般情况下,默认使用launch::async参数。

    69530

    C++ 异步编程之协程代码实践

    co_spawn 函数用于 io_context 的执行器上启动 async_print 协程。...它接收一个执行器(ex)、一个信号对象指针(sig)和一个完成令牌(token)。函数内部使用boost::asio::async_initiate来包装异步操作。...内部逻辑: 连接到信号,当信号触发,使用boost::asio::post将回调函数发布到指定的执行器上执行。这确保了回调是正确的上下文中执行。...检查连接状态,确保信号仍然连接执行用户的处理逻辑。 实现一个协程方法 定义一个协程方法,使用awaitable 来声明协程或异步的返回类型。...可以看到每一次轮询都会调用co_await来等待异步任务FetchPayResult结果,也是通过协程的方式来处理网络请求。

    11610

    spdlog学习笔记

    线程安全 spdlog:: 命名空间下的是线程安全的,当loggers不同的线程同时执行时,下述函数不应该被调用: spdlog::set_error_handler(log_err_handler)...,库都会将新模式设置为内部有效标识 – 这种方式使得即便在复杂模式下,性能仍然很高(每次记录日志不会重新解析模式) 模式标记 flag meaning example %v The actual text...(默认行为) 移除并替换队列中最旧的信息,不用等待可用空间 使用 create_async_nb 工厂函数或者 logger构造使用spdlog::async_overflow_policy auto...async loggers 这意味着创建和销毁 async loggers非常廉价,因为它们不拥有或者创建任何后台线程或队列–它们被共享的线程池对象创建和管理 队列中所有的槽都是在线程池构造预分配的(...由一个单独的工作线程定期调用每一个logger的flush()实现 下例中,对所有已注册的loggers定期5秒调用flush(): spdlog::flush_every(std::chrono::seconds

    1.3K21

    Pin解析

    所有权转移给了 s2。...怎么 Pin 住的 保证 T 不会被move,需要避免两种情况: 不能暴露 T ,否则赋值、方法调用都会move 不能暴露 &mut T,开发者可以调用 std::mem::swap() 或 std:...Unpin async fn async fn 是语法糖,在编译,编译器使用Generator为 async fn 生成匿名结构体,这个结构体实现了 Future。 这个匿名结构体是自引用的。...原因是,如果 async fn 内有多个 await,执行到 await 可能因为资源没准备好而让出 CPU 暂停执行,随后该 Future 可能被调度到其他线程接着执行。...async fn 语法糖生成的实现了 Future 的匿名结构,内部包含自引用,它会明确实现 !Unpin,不能 move。 但如果你自己实现的 Future,内部没有自引用,它就不是 !

    22010

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

    构造一次。...(七)std::async std::async 是一个很好用的异步执行抽象,但是使用的时候可能一不小心,你的代码就变成了同步调用: 不指定 policy std::async 的接口是: template...::deferred懒惰执行,如果你使用第一种接口不指定 policy,那么编译器可能会自己帮你选择懒惰执行,也就是调用 future.get()的时候才同步执行。...因为 std::async 会返回一个 std::future,而这个 std::future 析构,会同步等待函数返回结果才析构结束。这也是上文“隐形的析构”的另外一种表现。...某些条件下,编译器会自动将循环优化为向量化操作: 循环内部访问的是连续内存 循环内部没有函数调用,没有 if 分支 循环之间没有依赖 举个例子,下方的代码非常的向量化不友好: enum Type {

    1.7K41
    领券