0

0

C++如何实现单线程异步任务_C++11中async与future用法【并发】

冰火之心

冰火之心

发布时间:2026-02-04 16:15:08

|

256人浏览过

|

来源于php中文网

原创

std::async默认不真正异步,仅延迟求值;需显式指定std::launch::async才启用新线程,且future析构会阻塞等待,get()后失效,应避免误用。

c++如何实现单线程异步任务_c++11中async与future用法【并发】

async 会真的异步执行吗?

不会,std::async 默认行为是“延迟求值”(std::launch::deferred),也就是调用时并不启动新线程,而是在你调用 get()wait() 时才同步执行——这根本不是异步。

必须显式指定 std::launch::async 才能真正启用新线程:

auto fut = std::async(std::launch::async, []{ return 42; });
  • 漏写 std::launch::async 是最常见错误,尤其在调试时发现任务卡主线程
  • 不加参数或只传函数对象,等价于 std::launch::deferred | std::launch::async,系统可自由选择策略,行为不可控
  • 某些平台(如 MinGW)对 std::launch::async 支持不完整,可能退化为 deferred

future.get() 调用一次就失效

std::future 是一次性消费对象:调用 get() 后,其内部状态变为“已获取”,再次调用会抛出 std::future_error(错误码为 std::future_errc::no_state)。

典型错误场景:

立即学习C++免费学习笔记(深入)”;

auto f = std::async(std::launch::async, []{ return 123; });
int a = f.get(); // ✅ 正常
int b = f.get(); // ❌ 抛异常:std::future_error
  • 不能把同一个 future 保存下来反复取结果
  • 若需多次访问结果,应把 get() 结果存入变量,或改用 std::shared_future
  • shared_future 可拷贝,且所有副本共享同一状态,适合多处等待或读取

async 对象生命周期管理很关键

std::async 返回的 future 对象,其析构会**阻塞等待任务结束**——哪怕你没调用 get()

智谱AI开放平台
智谱AI开放平台

智谱AI大模型开放平台-新一代国产自主通用AI开放平台

下载

这意味着:

{
    auto f = std::async(std::launch::async, []{
        std::this_thread::sleep_for(2s);
        return 99;
    });
    // f 还没 get(),但作用域结束 → 析构 → 主线程卡住 2 秒!
}
  • 这是单线程异步逻辑中最隐蔽的“伪异步”陷阱
  • 若任务耗时长且你不关心结果,应主动调用 wait()get() 并捕获异常,或改用 std::thread + 分离(但要自己管资源)
  • 更安全的做法是立刻 move 出去,或用智能指针托管,避免意外析构

替代方案:不用 async 也能做单线程异步

所谓“单线程异步”,本质是**不阻塞当前线程、延后执行、支持回调或轮询**。C++11 的 async/future 天然依赖线程,不适合真·单线程调度。

更贴合的实现方式包括:

  • std::function + 队列 + 主循环(如游戏/嵌入式常见的 job queue)
  • 基于 std::chronopoll / select 实现定时任务(无第三方库时)
  • 借助 boost::asio::io_context(即使只 run_one 线程)提供统一异步原语
  • 现代 C++20 可用 std::jthread + std::stop_token 更可控地管理任务生命周期

async 不是万能胶,它解决的是“开个线程跑任务并拿结果”,而不是“异步编程模型”。混淆这两者,容易让代码既难测又难维护。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

588

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

588

2023.08.10

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

87

2025.12.01

function是什么
function是什么

function是函数的意思,是一段具有特定功能的可重复使用的代码块,是程序的基本组成单元之一,可以接受输入参数,执行特定的操作,并返回结果。本专题为大家提供function是什么的相关的文章、下载、课程内容,供大家免费下载体验。

486

2023.08.04

js函数function用法
js函数function用法

js函数function用法有:1、声明函数;2、调用函数;3、函数参数;4、函数返回值;5、匿名函数;6、函数作为参数;7、函数作用域;8、递归函数。本专题提供js函数function用法的相关文章内容,大家可以免费阅读。

164

2023.10.07

全国统一发票查询平台入口合集
全国统一发票查询平台入口合集

本专题整合了全国统一发票查询入口地址合集,阅读专题下面的文章了解更多详细入口。

37

2026.02.03

短剧入口地址汇总
短剧入口地址汇总

本专题整合了短剧app推荐平台,阅读专题下面的文章了解更多详细入口。

103

2026.02.03

植物大战僵尸版本入口地址汇总
植物大战僵尸版本入口地址汇总

本专题整合了植物大战僵尸版本入口地址汇总,前往文章中寻找想要的答案。

49

2026.02.03

c语言中/相关合集
c语言中/相关合集

本专题整合了c语言中/的用法、含义解释。阅读专题下面的文章了解更多详细内容。

9

2026.02.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号