C++11 异步编程入门教程 📅 发布时间:2026/7/9 23:30:43 👁️ 浏览次数: 1. 概述C11 引入了future头文件提供了一套标准化的异步编程工具用于简化多线程编程和异步任务管理。这套工具主要包括std::future、std::shared_future、std::async、std::promise、std::packaged_task等组件。2. std::futurestd::future是一个模板类用于获取异步操作的结果。它代表一个“未来”的值当异步操作完成后可以通过它获取结果。常用接口get(): 获取结果如果结果未就绪则阻塞等待valid(): 检查 future 是否关联了共享状态wait(): 阻塞等待结果就绪wait_for(): 等待一段时间返回状态wait_until(): 等待到指定时间点返回状态示例代码#include iostream #include future #include thread #include chrono int calculate() { std::this_thread::sleep_for(std::chrono::seconds(2)); // 模拟耗时计算 return 42; } int main() { // 启动异步任务 std::futureint fut std::async(std::launch::async, calculate); std::cout Doing other work... std::endl; // 获取结果会阻塞直到结果就绪 int result fut.get(); std::cout Result: result std::endl; return 0; }3. std::shared_futurestd::shared_future是std::future的共享版本可以被多个线程安全地访问。与std::future不同shared_future的get()方法可以多次调用。常用接口get(): 获取结果可多次调用valid(): 检查是否有效wait(): 等待结果示例代码#include iostream #include future #include vector #include thread void worker(std::shared_futureint sf) { // 多个线程可以安全地访问同一个 shared_future int result sf.get(); std::cout Thread std::this_thread::get_id() got result: result std::endl; } int main() { std::promiseint prom; std::shared_futureint sf prom.get_future(); // 创建多个线程共享同一个 future std::vectorstd::thread threads; for (int i 0; i 3; i) { threads.emplace_back(worker, sf); } // 设置值 prom.set_value(100); for (auto t : threads) { t.join(); } return 0; }4. std::asyncstd::async是一个函数模板用于启动异步任务。它返回一个std::future对象可以通过该对象获取异步任务的结果。启动策略std::launchstd::launch::async: 在新线程中异步执行std::launch::deferred: 延迟执行调用 get() 时执行std::launch::async | std::launch::deferred: 默认策略由实现决定示例代码#include iostream #include future #include chrono int heavy_computation(int x) { std::this_thread::sleep_for(std::chrono::seconds(1)); return x * x; } int main() { // 异步执行立即在新线程中启动 auto fut1 std::async(std::launch::async, heavy_computation, 10); // 延迟执行调用 get() 时才执行 auto fut2 std::async(std::launch::deferred, heavy_computation, 20); std::cout fut1 is running asynchronously... std::endl; // 获取异步结果 int result1 fut1.get(); std::cout Result1: result1 std::endl; // 此时才开始执行 fut2 int result2 fut2.get(); std::cout Result2: result2 std::endl; return 0; }5. std::promisestd::promise用于在线程之间传递结果。它提供了一个“承诺”可以在未来某个时间点设置值并通过关联的std::future获取该值。常用接口get_future(): 获取关联的 future 对象set_value(): 设置值set_exception(): 设置异常示例代码#include iostream #include future #include thread #include stdexcept void producer(std::promiseint prom) { try { std::this_thread::sleep_for(std::chrono::seconds(1)); prom.set_value(42); // 设置结果 } catch (...) { prom.set_exception(std::current_exception()); // 设置异常 } } int main() { std::promiseint prom; std::futureint fut prom.get_future(); std::thread t(producer, std::move(prom)); try { int result fut.get(); std::cout Received result: result std::endl; } catch (const std::exception e) { std::cout Exception: e.what() std::endl; } t.join(); return 0; }6. std::packaged_taskstd::packaged_task是一个可调用对象的包装器它可以将函数调用与其结果关联起来。类似于std::function但多了获取 future 的功能。常用接口get_future(): 获取关联的 futureoperator(): 执行任务valid(): 检查是否有效示例代码#include iostream #include future #include thread int multiply(int x, int y) { return x * y; } int main() { // 包装一个函数 std::packaged_taskint(int, int) task(multiply); std::futureint fut task.get_future(); // 在另一个线程中执行任务 std::thread t(std::move(task), 6, 7); // 获取结果 int result fut.get(); std::cout 6 * 7 result std::endl; t.join(); return 0; }7. std::future_statusstd::future_status是一个枚举类用于表示等待操作的结果状态。状态值future_status::ready: 结果已就绪future_status::timeout: 超时结果未就绪future_status::deferred: 任务被延迟执行示例代码#include iostream #include future #include chrono int slow_function() { std::this_thread::sleep_for(std::chrono::seconds(3)); return 100; } int main() { auto fut std::async(std::launch::async, slow_function); // 等待 1 秒 auto status fut.wait_for(std::chrono::seconds(1)); if (status std::future_status::ready) { std::cout Result is ready! std::endl; std::cout Value: fut.get() std::endl; } else if (status std::future_status::timeout) { std::cout Timeout: result not ready yet std::endl; } else if (status std::future_status::deferred) { std::cout Task is deferred std::endl; } // 最终获取结果 std::cout Final result: fut.get() std::endl; return 0; }8. 综合示例生产者-消费者模式#include iostream #include future #include thread #include queue #include mutex #include condition_variable templatetypename T class ThreadSafeQueue { private: std::queueT queue_; std::mutex mutex_; std::condition_variable cond_; public: void push(T value) { std::lock_guardstd::mutex lock(mutex_); queue_.push(std::move(value)); cond_.notify_one(); } T pop() { std::unique_lockstd::mutex lock(mutex_); cond_.wait(lock, [this]{ return !queue_.empty(); }); T value std::move(queue_.front()); queue_.pop(); return value; } }; void producer(ThreadSafeQueuestd::promiseint queue, int count) { for (int i 0; i count; i) { std::promiseint prom; auto fut prom.get_future(); queue.push(std::move(prom)); // 模拟生产耗时 std::this_thread::sleep_for(std::chrono::milliseconds(100)); prom.set_value(i * i); // 设置结果 } } void consumer(ThreadSafeQueuestd::promiseint queue, int count) { for (int i 0; i count; i) { auto prom queue.pop(); auto fut prom.get_future(); int result fut.get(); std::cout Consumed: result std::endl; } } int main() { ThreadSafeQueuestd::promiseint queue; std::thread prod(producer, std::ref(queue), 5); std::thread cons(consumer, std::ref(queue), 5); prod.join(); cons.join(); return 0; }9. 总结future/promise: 最基本的异步结果传递机制async: 最简单的异步任务启动方式packaged_task: 包装可调用对象便于线程池使用shared_future: 支持多个消费者共享结果future_status: 用于非阻塞的状态检查这套工具使得 C 异步编程更加标准化和安全避免了直接操作线程和锁的复杂性。
数字图像处理篇---JPEG2000 核心比喻:从“马赛克拼图”到“水彩晕染”还记得JPEG是把图切成8x8的小块(马赛克)单独处理吗?这带来了“块状伪影”的问题。 JPEG2000放弃了“切块”思路,改用了一种更先进、更连续的方法——小波变换。想象你要临摹一… 2026/7/5 11:25:53
【毕业设计】基于springboot+小程序的自助停车缴费系统小程序的设计与实现(源码+文档+远程调试,全bao定制等) 博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am… 2026/5/17 3:28:13
小程序计算机毕设之基于springboot+小程序的自助停车缴费系统小程序的设计与实现基于SpringBoot的停车管理微信小程序系统(完整前后端代码+说明文档+LW,调试定制等) 博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am… 2026/7/9 16:11:55
三角形内心坐标计算 3 种方法:向量法、角平分线法、重心坐标法 三角形内心坐标计算的三种实用算法:从数学推导到代码实现在计算机图形学、游戏开发和几何算法竞赛中,三角形内心坐标的计算是一个基础但至关重要的操作。内心不仅是三角形内切圆的圆心,也是许多几何算法中的关键参考点。本文将深入探讨三种计… 2026/7/9 23:28:47
OpenClaw具身智能系统:多Agent实时协作与阿里云本地混合部署 1. OpenClaw不是“另一个Agent框架”,而是多智能体协作的物理世界接口层 很多人第一次看到OpenClaw,下意识就去翻它的GitHub README,然后点开examples目录,照着跑一个 python run_demo.py --agent_nameweb_surfer ——结果卡在 … 2026/7/9 23:28:47
STM32与TLP241A在电气隔离系统中的应用实践 1. 电气隔离在嵌入式系统中的核心价值 在工业控制、医疗设备和电力监测等关键领域,电气隔离早已不是可有可无的"加分项",而是确保系统稳定运行的底线要求。去年参与某污水处理厂PLC系统改造时,我们就曾因忽视隔离设计导致整个中控室… 2026/7/9 23:28:47
Hermes Agent:本地智能体运行时与CLI工具编排中枢 1. Hermes Agent 不是“另一个 CLI 工具”,而是你本地智能体工作流的调度中枢Hermes Agent 这个名字最近在开发者社区里频繁刷屏,但很多人点开官网或 GitHub 仓库后第一反应是:“这到底是个啥?CLI?桌面应用?… 2026/7/9 23:26:47
Trae本地代码认知增强:Git驱动的claude.md同步与Code Review Graph 1. 项目概述:Trae 写代码时真正省时间的两个操作,不是噱头是实测高频动作Trae 这个工具最近在开发者圈子里讨论度很高,尤其在 Code Review、重构洞察和 Git 协作流程里频繁出现。但很多人装完 Trae 后,还在用它当“高级聊天框”—… 2026/7/9 23:22:43
Comic Backup:如何将在线漫画真正变为你的永久收藏? Comic Backup:如何将在线漫画真正变为你的永久收藏? 【免费下载链接】comic-backup Back up your comics as CBZ. 项目地址: https://gitcode.com/gh_mirrors/co/comic-backup 你是否曾担心过,那些花费真金白银购买的在线漫画… 2026/7/9 23:22:43
机器视觉与PLC集成:轮毂缺陷检测与字符识别误差控制在0.2mm内 机器视觉与PLC集成:轮毂缺陷检测与字符识别误差控制在0.2mm内的技术实现轮毂作为汽车关键零部件,其表面质量直接影响行车安全与美观。传统人工检测效率低且易漏检,而采用机器视觉与PLC集成方案可实现微米级精度检测。本文将深入解析高精度视觉… 2026/7/9 0:01:04
GBase 8a vs MySQL 8.0:ALTER TABLE语法与限制的5点关键差异对比 GBase 8a与MySQL 8.0:ALTER TABLE语法差异深度解析与实战指南1. 两种数据库的ALTER TABLE能力全景对比在数据库架构设计和运维过程中,表结构变更(DDL操作)是不可避免的需求。GBase 8a作为国产分析型数据库代表,与开源M… 2026/7/9 0:03:06
【大数据毕业设计】基于多源旅游数据的景区热度分析与推荐系统的设计与实现 基于 Django 的旅游偏好挖掘与景区推荐系统(源码+文档+远程调试,全bao定制等) 博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am… 2026/7/9 0:05:09
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/7 11:26:57
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/8 20:15:17
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/8 14:25:08