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

将std::async与std::launch::async一起使用时出现奇怪的行为

是因为std::async函数的默认行为是根据实际情况选择是同步执行还是异步执行任务。当std::launch::async参数被传递给std::async时,它指示std::async始终以异步方式执行任务。

然而,当std::async与std::launch::async一起使用时,可能会出现以下奇怪的行为:

  1. 任务可能在调用std::async的线程上同步执行,而不是在新的线程上异步执行。这可能是因为系统资源不足或线程池已满,导致std::async无法创建新的线程来执行任务。
  2. 任务可能在调用std::async的线程上异步执行,但在std::async返回之前就完成了。这可能是因为任务非常简单,执行速度非常快,导致任务在std::async返回之前就完成了。

为了解决这些奇怪的行为,可以使用std::future和std::promise来显式地控制任务的执行方式。通过使用std::promise,可以在任务完成时手动设置结果,并通过std::future获取结果。这样可以确保任务在需要结果时才返回。

以下是一个示例代码,演示了如何使用std::future和std::promise来控制任务的执行方式:

代码语言:txt
复制
#include <iostream>
#include <future>

int main() {
    std::promise<int> promise;
    std::future<int> future = promise.get_future();

    std::async(std::launch::async, [&promise]() {
        // 执行任务
        int result = 42;

        // 设置结果
        promise.set_value(result);
    });

    // 获取结果
    int result = future.get();

    std::cout << "Result: " << result << std::endl;

    return 0;
}

在这个示例中,我们创建了一个std::promise对象和一个std::future对象。通过调用std::promise的set_value函数,我们手动设置了任务的结果。然后,通过调用std::future的get函数,我们获取了任务的结果。

这种方式可以确保任务始终以异步方式执行,并且在需要结果时才返回。同时,这种方式也可以避免std::async与std::launch::async一起使用时可能出现的奇怪行为。

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

  • 腾讯云函数计算(云原生无服务器计算服务):https://cloud.tencent.com/product/scf
  • 腾讯云容器服务(云原生容器化部署与管理服务):https://cloud.tencent.com/product/tke
  • 腾讯云数据库(云原生数据库服务):https://cloud.tencent.com/product/cdb
  • 腾讯云CDN(内容分发网络服务):https://cloud.tencent.com/product/cdn
  • 腾讯云安全产品(网络安全服务):https://cloud.tencent.com/product/saf
  • 腾讯云人工智能服务(AI服务):https://cloud.tencent.com/product/ai
  • 腾讯云物联网套件(物联网平台服务):https://cloud.tencent.com/product/iot-suite
  • 腾讯云移动开发套件(移动应用开发服务):https://cloud.tencent.com/product/mob
  • 腾讯云对象存储(云原生对象存储服务):https://cloud.tencent.com/product/cos
  • 腾讯云区块链服务(区块链技术服务):https://cloud.tencent.com/product/baas
  • 腾讯云虚拟专用网络(网络通信服务):https://cloud.tencent.com/product/vpc
  • 腾讯云音视频处理(音视频处理服务):https://cloud.tencent.com/product/mps
  • 腾讯云元宇宙(虚拟现实技术服务):https://cloud.tencent.com/product/vr
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Chapter 7: The Concurrency API

当就绪软件线程数量大于硬件线程数量时,就会出现过载现象,此时,系统线程调度器按时间片软件线程调度到硬件线程上执行,而线程切换会给系统增加整体线程管理开销,尤其是当一个硬件线程上软件线程调度到另一个...但是对于GUI线程响应可能会出现问题,因为调度器并不知道应用哪个线程会有高响应度要求,这时需要对std::async使用std::launch::async启动策略,它能确保函数会在另一个不同线程上执行...默认情况下,std::async启动机制既不是std::launch::async,也不是std::launch::deferred,而是它们并集,即 auto fut1 = std::async(...//并发执行其他任务 } ... } 使用默认启动机制std::async时,需要满足以下条件 任务不需要与调用线程并发运行 线程局部变量读写无关 要么保证std::async...std::launch::async 这个future是引用shared state最后一个future 正常行为:其他future对象在析构时都只会破坏这个future对象 产生shared

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

    其中前者仅限于std:mutex配合使用,后者可以和任何满足最低标准互斥量一起使用。   从体积、性能以及系统资源使用方面,推荐使用 std::condition_variable。...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不同是,std::packaged_task可以任务期望打包,移动到指定线程显示调用packaged_task,future才会就绪;而std::async()不能指定线程运行任务...std::async在使用时一定主要处理其返回std::future,否则会引发隐蔽且严重bug。详见std::async避坑章节。

    1.1K40

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

    【注:此处应额外补充 alloc 构造函数】 3,std::promise std::future 状态相关联,它负责共享值存入并给 std::future 访问使用,值类型也有可能是void、...; } 是的,你还看到了另一个奇怪东西:std::packaged_task。...这就是[异步调用主动][延迟调用被动]区别。 注意是,如果不传第一个枚举参数,那么,std::async 优先使用哪种 launch 取决于编译器实现机制。...而是进行惰性求值:在 async 所返回 std::future 上首次调用非定时等待函数,导致在当前线程(不必是最初调用 std::async 线程)中,以 args... ...【C++ 14 开始】若 policy 中未设置 std::launch::asyncstd::launch::deferred 或任何实现定义策略标志,则行为未定义。

    1.5K30

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

    并行化业务逻辑:经常需要频繁发送,等待,接收其他业务线程数据,信息交换是常见且高频行为,这个时候就要开发高效异步编程了。 2,什么是异步编程?同步编程又是什么?...核心思想:promisefuture是成对出现。生产者通过promise赋值,消费者通过future取值。...=" << accumulate_future.get() << '\n'; //std::async能在很大程度上简少编程工作量,使我们不用关注线程创建内部细节,就能方便获取异步执行状态和结果...std::promisestd::packaged_task在使用时既需要创建提供共享状态对象(promisepackaged_task),又需要创建访问共享状态对象...(futureshared_future),std::async能在很大程度上简少编程工作量,使我们不用关注线程创建内部细节,就能方便获取异步执行状态和结果,还可以指定线程创建策略。

    54520

    学习|C++线程指针结合小例子

    std::async,他里面thread都能实现,而且还能实现一些更多方法 std::async简单用法 微卡智享 其实这个用法网上可以找到一大堆,这里我就简单说一下就行了,因为这也不是这篇文章想讲重点...std::future res = std::async(启动策略, 函数名, 参数); 上面这段就是一个简单使用,其中async三个参数: 参数1:启动策略 std::launch::async...保证异步行为,执行后,系统创建一个线程执行对应函数 std::launch::deffered 当其他线程调用get()来访问共享状态时,调用非异步行为 std::launch::async||std...(launch::async, AddintPtr, &x, &y, &z); future res2 = async(launch::async, Addint, x, y, z);...这里就是想告诉大家,在cout输出时候,它是直接从缓冲区输出,刚开始没有加锁时候,两个线程同时执行时,cout输出时有时候会出现输出在同一行中,所以我们这里加入metux进行锁控制,防止出现缓冲区输出重叠现像出现

    1K10

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

    * 1,std::launch::async启动策略意味着函数f必须以异步方式运行,在另一个线程上执行 * * 2,std::launch::deferred启动策略意味着函数f只会在 std::async...auto fut2 = std::async(std::launch::async | std::launch::deferred, doAsyncWork...wait 调用程序逻辑 // • 如果异步是必要,则指定 std: :launch: :async 3条款37:使 std::thread 型别对象在所有路径皆不可联结 /** * @brief...();//此时我们知道期望对象 fut没有指涉到由 std::async调用产生共享状态,所以它析构函数表现为常规行为 //但是 std::packsgaed_task不能复制,pt传递给...* * 2,传递实参型别容器持有之物型别不同 * * 3,容器不太可能由于出现重复情况而拒绝待添加新值 * * 同时是否考虑利用置入函数,还要关心两个问题: * * * @return int

    2.4K40

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

    相关 貌似把volatile放在并发里介绍不太合适,但是貌似很多人都会把volatile和多线程联系在一起,那就一起介绍下吧。...async具体语法如下: async(std::launch::async | std::launch::deferred, func, args...); 第一个参数是创建策略: std::launch...若从 std::async 获得 std::future 未被移动或绑定到引用,则在完整表达式结尾, std::future析构函数阻塞直至异步计算完成,实际上相当于同步操作: std::async...(std::launch::async, []{ f(); }); // 临时量析构函数等待 f() std::async(std::launch::async, []{ g(); }); // f(...::forward(f), std::forward(params)...); } 总结 • std::thread使线程创建变得非常简单,还可以获取线程id等信息。

    61120

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

    auto f = std::async(std::launch::async, Y(), 1.2); ---- 4.2.2 关联future实例任务 类模板packaged_task把任务包装起来...它具备函数调用操作符,参数取决于上述模板参数,调用时参数传递给任务函数,通过get_future获取future对象,异步运行得到结果后保存到该对象。...下面是单线程处理多个连接例子。这里假设传入数据包含有ID荷载数据,接收后IDpromise对应,将相关值设为荷载数据。对于传出数据而言,promise相关值是代表是否成功bool。...()) { return input; } // input开头剪切到result // 以此为分界值,input分为两段 std::list...(std::async(std::launch::async, [&, i] { data[i] = make_data(i); done.count_down

    36720

    std future get_waitkey(0)

    ::launch::deferred,myThread1, 3); 当std::async()第一个参数为std::lanuch::deferred时生效。...互斥量加锁一般是针对一个代码段,而原子操作针对一般都是一个变量。 原子操作,一般都是指* 不可分割操作 * ;也就是说这种操作状态要么是完成,要么是没完成,不可能出现半完成状态。...注意使用时需要添加#include 头文件 实例1:计算自增后值: std::atomic g_count = 0; void myThread() { for (size_t...(如数据包累计发送或者接受数目),如果多个线程一起统计,不使用原子操作会导致统计发生混乱。...如发现本站有涉嫌侵权/违法违规内容, 请发送邮件至 举报,一经查实,本站立刻删除。

    38930

    C++11异步编程(std::async, std::future, std::packaged_task, std::promise)

    () << std::endl; std::packaged_task        std::packaged_task是一个类模板,顾名思义是用来打包一个可调用对象封装起来,然后可以将其返回值传给... std::promise是一个类模板,它作用是在不同线程中实现数据同步,future结合使用,也间接实现了future在不同线程间同步。...它实现方法有两种,一种是std::launch::async,这个是直接创建线程,另一种是std::launch::deferred,这个是延迟创建线程(当遇到future.get或者future.wait...时候才会创建线程),这两个参数是std::async第一个参数,如果没有使用这个两个参数,也就是第一个参数为空的话,那么第一个参数默认为std::launch::async | std::launch...当执行到fu.get才开始创建线程 std::future fu = std::async(std::launch::deferred, fun, 1); std::cout << fu.get

    15.7K30

    C++异步:asiocoroutine实现!

    (一)通过callback进行唤醒 这也是asio一大特色,原有的一系列async_xxxx()异步回调接口,通过这种机制就能很好协程结合起来了,如示例中: co_await timer.async_wait...模式实现,再来了解coroutine 模式下它实现,从而深入理解asio为什么能够callback直接转换为co_await,coroutine无缝对接。...<< std::endl; }); timer本身对async_result使用很简单,因为我们在此处并不需要提供额外返回值,所以timer在非coroutine工作模式下,仅仅只是起到了一个外界传入...frame stack部分小结 其实asio这里实现,跟coroutine本身理念是有点相背离,我们通过coroutine,其实有些时候期望更多分离代码更系统组织到一起,这样一方面整体代码组织更线性...,这种代码本身迭代维护就存在较高成本,如果出现问题,分析起来也是一种比较麻烦事情。

    3.7K21

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

    线程管理: std::thread 对象代表一个线程,可以通过该对象来管理线程状态和行为,如启动线程、等待线程结束、查询线程 ID 等。...线程同步: 在多线程编程中,通常需要使用同步机制来确保线程间协调和数据正确访问。std::thread 可以与其他同步原语(如互斥量、条件变量等)一起使用,实现线程间同步和通信。...这意味着要么所有互斥量都成功加锁,要么所有互斥量都不被加锁,不会出现部分加锁情况。 避免死锁: std::lock 函数可以避免死锁发生。...执行策略: std::async 支持三种执行策略:std::launch::asyncstd::launch::deferred 和默认策略。...std::launch::async 策略表示在新线程或者线程池中执行任务,std::launch::deferred 策略表示延迟执行任务直到调用 get() 函数时,而默认策略由编译器决定。

    27710
    领券