当前位置: 首页 > article >正文

std::promise和std::future的用法

1、std::promise和std::future注意用来在线程间传递数据不用手工同步来传递数据。2、在之前通过传递引用来传递数据也能达到上述效果但是需要手动同步否则获取到不可预测的结果。#include iostream #include thread void func(std::vectorint myVector,int result) { auto it std::max_element(myVector.begin(),myVector.end()); result *it; } int main() { int result 0; std::vectorint myVector{1,2,3,6,7,8,99,12}; std::thread thread01(func,std::ref(myVector),std::ref(result));//创建一个子线程调用func并把结果放引用参数中 thread01.join();//这里要手动同步等待线程结束才能下一句正确打印 std::cout result std::endl;//如果上面没有join就会得到错误的结果。 return 0; }3、一种更安全的线程间传递数据的方式使用promise设定值使用promise.get_future关联futrue对象通过future.get()来获取promise设定的值而且future的get自动同步promise如果promise的set未完成会自动阻塞并等待直到set完成。//更好的传递数据的方式 #include iostream #include thread #include vector #include chrono #include future #include algorithm void func(std::vectorint myVector,std::promiseint pro) { std::this_thread::sleep_for(std::chrono::seconds(2));//模拟子线程执行需要2秒 auto it std::max_element(myVector.begin(),myVector.end()); pro.set_value(*it);//子线程用来设定结果 } int main() { std::vectorint myVector{1,3,6,7,8,2,4}; std::promiseint pro;//创建一个promise对象 std::futureint fut pro.get_future();//创建一个future对象并关联到promise std::thread thread01(func,std::ref(myVector),std::ref(pro)); int result fut.get();//会自动等待promise.set()结束 std::cout result std::endl; thread01.join(); return 0; }4、在函数参数中type表示参数可以接受一个右值引用对象即参数可以接受一个临时对象针对不可复制对象传递参数时需要使用std::move方式传递转移对象的所有权。type表示接受一个引用对象如果对象也是不可复制对象需要使用std::ref()函数将对象进行包装为左值引用对象。#include iostream #include future #include thread #include vector #include algorithm #include chrono //线程函数 void find_max(const std::vectorint vec, std::promiseint prom)//接受一个promise右值引用对象 //void find_max(const std::vectorint vec, std::promiseint prom)//接受一个promise引用对象 { std::this_thread::sleep_for(std::chrono::seconds(2)); try { auto it std::max_element(vec.begin(), vec.end()); prom.set_value(*it);//设置结果 } catch (...) { prom.set_exception(std::current_exception());//设置异常结果 } } void findMin(std::vectorint myVector,int result) { auto it std::min_element(myVector.begin(), myVector.end()); result *it; } int main() { std::vectorint data{1,5,3,9,2}; std::promiseint prom;//主线程创建一个promise对象 std::futureint fut prom.get_future();//主线程通过调用get_future()获得与promise对象相关联的future对象 std::thread worker(find_max, std::cref(data), std::move(prom));//创建一个子线程传递数据和promise对象的右值引用 //std::thread worker(find_max, std::ref(data), std::ref(prom));//传递promise的左值引用对象 int result fut.get();//主线程通过调用future对象的get()方法获取结果如果子线程未完成计算主线程将会阻塞等待 std::cout Max element: result std::endl; int result2 0; std::thread thread02(findMin, std::ref(data), std::ref(result2)); thread02.join();//必须手动同步线程等待线程完成后才能访问result2 std::cout Min element: result2 std::endl; worker.join(); return 0; }5、以上2种方式都可以完成线程之间数据的传递推荐使用promise和future的方式这样自动线程同步而且不仅提供了设定值而且异常时可以设定异常promise.set_exception()来设定异常而且当不需要阻塞时可以使用wait_for() wait_until()来设定等待的时间特别适用于生产者消费者模式但注意的是promise只能set_value一次future也只能get一次。6、鉴于这种线程间通信传递数据方式只适合于“单次、异步任务的结果传递”不适合“持续生成和消费”的情形。C原生支持持续生成和消费者模式。如下#include iostream #include thread #include queue #include mutex #include condition_variable #include chrono // 简单的线程安全阻塞队列 templatetypename T class BlockingQueue { private: std::queueT queue_; std::mutex mtx_; std::condition_variable cv_producer_; // 通知生产者队列不满 std::condition_variable cv_consumer_; // 通知消费者队列不空 size_t max_size_; public: BlockingQueue(size_t max_size) : max_size_(max_size) {} // 生产者放入数据。如果队列满了就阻塞等待 void push(T item) { std::unique_lockstd::mutex lock(mtx_); cv_producer_.wait(lock, [this] { return queue_.size() max_size_; }); queue_.push(std::move(item)); std::cout [生产] 生产了一个数据队列大小: queue_.size() std::endl; cv_consumer_.notify_one(); // 叫醒一个正在等待的消费者 } // 消费者取出数据。如果队列空了就阻塞等待 T pop() { std::unique_lockstd::mutex lock(mtx_); cv_consumer_.wait(lock, [this] { return !queue_.empty(); }); T item std::move(queue_.front()); queue_.pop(); std::cout [消费] 消费了一个数据队列剩余: queue_.size() std::endl; cv_producer_.notify_one(); // 叫醒一个正在等待的生产者 return item; } }; // 使用示例 int main() { BlockingQueueint bq(5); // 容量为5的队列 // 生产者线程 std::thread producer([bq] { for (int i 0; i 20; i) { bq.push(i); std::this_thread::sleep_for(std::chrono::milliseconds(50)); } }); // 消费者线程 std::thread consumer([bq] { for (int i 0; i 20; i) { int val bq.pop(); std::this_thread::sleep_for(std::chrono::milliseconds(150)); // 消费慢一点 } }); producer.join(); consumer.join(); return 0; }

相关文章:

std::promise和std::future的用法

1、std::promise和std::future注意用来在线程间传递数据&#xff08;不用手工同步来传递数据&#xff09;。2、在之前通过传递引用来传递数据&#xff0c;也能达到上述效果&#xff0c;但是需要手动同步&#xff0c;否则获取到不可预测的结果。#include <iostream> #incl…...

京东抢购神器JDspyder:3步实现自动化秒杀,告别手动抢购烦恼

京东抢购神器JDspyder&#xff1a;3步实现自动化秒杀&#xff0c;告别手动抢购烦恼 【免费下载链接】JDspyder 京东预约&抢购脚本&#xff0c;可以自定义商品链接 项目地址: https://gitcode.com/gh_mirrors/jd/JDspyder 还在为抢不到心仪商品而烦恼吗&#xff1f;J…...

NVIDIA Profile Inspector:显卡性能调校的艺术与技术深度解析

NVIDIA Profile Inspector&#xff1a;显卡性能调校的艺术与技术深度解析 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 在显卡性能优化的领域中&#xff0c;NVIDIA Profile Inspector&#xff08;NPI…...

图片修复神器:fft npainting lama快速去除水印实战体验

图片修复神器&#xff1a;fft npainting lama快速去除水印实战体验 1. 为什么选择fft npainting lama进行图片修复&#xff1f; 在日常工作和生活中&#xff0c;我们经常会遇到需要处理图片的情况&#xff1a;去除水印、修复老照片、删除不需要的物体等。传统方法要么需要专业…...

Pixel Dimension Fissioner 企业级CI/CD流水线设计:从代码到部署

Pixel Dimension Fissioner 企业级CI/CD流水线设计&#xff1a;从代码到部署 1. 为什么企业需要专属的AI模型CI/CD 电商公司的技术团队最近遇到了一个典型问题&#xff1a;每次更新Pixel Dimension Fissioner图像生成模型时&#xff0c;从代码修改到最终上线平均需要3天时间。…...

Kimi-VL-A3B-Thinking一文详解:开源VLM如何实现OCR/数学/多图理解三合一

Kimi-VL-A3B-Thinking一文详解&#xff1a;开源VLM如何实现OCR/数学/多图理解三合一 1. 模型简介与技术亮点 Kimi-VL-A3B-Thinking是一款创新的开源视觉语言模型(VLM)&#xff0c;采用混合专家(MoE)架构设计。这个模型最突出的特点是能够在仅激活2.8B参数的情况下&#xff0c…...

cv_resnet101_face-detection_cvpr22papermogface实战应用:演唱会观众人数实时估算

cv_resnet101_face-detection_cvpr22papermogface实战应用&#xff1a;演唱会观众人数实时估算 你有没有想过&#xff0c;一场演唱会到底有多少观众&#xff1f;主办方报的数字准不准&#xff1f;或者&#xff0c;作为活动策划者&#xff0c;你想快速评估一下现场的上座率&…...

手把手教你玩转HDS沉浸光感效果

鸿蒙开发干货——手把手教你玩转HDS沉浸光感效果 大家好&#xff0c;我是青蓝逐码的云杰。 最近有不少用户在交流时间到&#xff0c;应用底部 Tab 栏那种高级的“发光”和“沉浸”质感是怎么做出来的&#xff1f; 在鸿蒙应用开发中&#xff0c;细腻的光影和材质表现确实是提升…...

vLLM-v0.17.1实战教程:多LoRA动态切换支持个性化Agent服务

vLLM-v0.17.1实战教程&#xff1a;多LoRA动态切换支持个性化Agent服务 1. vLLM框架简介 vLLM是一个专为大型语言模型(LLM)设计的高性能推理和服务库&#xff0c;以其出色的吞吐量和易用性著称。这个项目最初由加州大学伯克利分校的天空计算实验室开发&#xff0c;现在已经发展…...

游戏工作室多开怎么快速识别?用IP查询定位服务三步锁定异常账号

开服第三天凌晨&#xff0c;运营群突然炸了——后台数据显示同时在线人数暴涨3倍&#xff0c;但付费率跌到了几乎为零。我拉了一下登录日志&#xff0c;发现80%以上的新增IP请求都来自几家云厂商的数据中心网段&#xff0c;归属地集中在少数几个城市&#xff0c;而且这些IP在24…...

重构设计工作流:HTML到Figma的智能转换技术解析

重构设计工作流&#xff1a;HTML到Figma的智能转换技术解析 【免费下载链接】figma-html Convert any website to editable Figma designs 项目地址: https://gitcode.com/gh_mirrors/fi/figma-html 在数字产品开发的现代工作流中&#xff0c;设计与代码之间的鸿沟一直是…...

Magnet2Torrent终极指南:如何将磁力链接快速转换为种子文件

Magnet2Torrent终极指南&#xff1a;如何将磁力链接快速转换为种子文件 【免费下载链接】Magnet2Torrent This will convert a magnet link into a .torrent file 项目地址: https://gitcode.com/gh_mirrors/ma/Magnet2Torrent 在P2P资源共享和下载管理中&#xff0c;磁…...

XUnity自动翻译器:5分钟打造你的专属中文游戏世界

XUnity自动翻译器&#xff1a;5分钟打造你的专属中文游戏世界 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为外语游戏中的生涩文本而烦恼吗&#xff1f;XUnity自动翻译器为你带来革命性的游戏本地…...

从“指纹”到“防伪钢印”:用程序员能懂的生活例子,图解Hash、MAC、HMAC的核心原理与安全升级

从“指纹”到“防伪钢印”&#xff1a;用程序员能懂的生活例子&#xff0c;图解Hash、MAC、HMAC的核心原理与安全升级 想象一下&#xff0c;你每天使用的Git提交、银行转账甚至登录验证&#xff0c;背后都依赖一套看不见的“数字封印”技术。这些技术从简单的数据指纹到复杂的防…...

3步搞定Unity游戏AI翻译:XUnity.AutoTranslator新手完全指南

3步搞定Unity游戏AI翻译&#xff1a;XUnity.AutoTranslator新手完全指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为看不懂的外语Unity游戏发愁吗&#xff1f;想轻松玩转全球游戏却卡在语言关&…...

从静态到动态:深度解析shields.io徽章生成与Git平台项目美化实战

1. 为什么你的开源项目需要徽章&#xff1f; 第一次在GitHub上看到那些花花绿绿的小徽章时&#xff0c;我完全没意识到它们的重要性。直到自己的项目star数一直上不去&#xff0c;才发现专业的第一印象有多关键。这些看似简单的彩色标签&#xff0c;实际上是项目的"数字名…...

空间注意力机制(SAM)的实证研究:超越Transformer的设计启示

1. 空间注意力机制&#xff08;SAM&#xff09;的前世今生 第一次接触空间注意力机制是在2019年那篇微软亚研的论文里&#xff0c;当时就被它反直觉的结论震撼到了。你可能听说过Transformer&#xff0c;但SAM才是真正让我重新思考注意力机制本质的研究。简单来说&#xff0c;它…...

Intv_AI_MK11辅助VMware虚拟机环境搭建与配置

Intv_AI_MK11辅助VMware虚拟机环境搭建与配置 1. 准备工作与环境概述 在开始AI开发之前&#xff0c;搭建一个稳定可靠的开发环境至关重要。VMware虚拟机提供了一个隔离且灵活的解决方案&#xff0c;让你可以在不影响主机系统的情况下运行Ubuntu等操作系统&#xff0c;并在其中…...

CSP策略对vue3项目的一些影响

1、避免使用 eval() 或 new Function()注&#xff1a;检查第三方库是否兼容 CSP 策略&#xff0c;有些老库可能偷偷用 eval()&#xff0c;要测试一下2、尽量避免内联样式 <!-- ✅ 编译后可能变成 JS 赋值&#xff0c;所以能通过--> <div :style"{ color: red}&qu…...

GNU Radio 3.8 OOT模块开发避坑指南:从gr_modtool到CMake编译的完整流程

GNU Radio 3.8 OOT模块开发深度排雷手册&#xff1a;从工具链配置到版本兼容性实战 在软件无线电(SDR)开发领域&#xff0c;GNU Radio作为开源标杆工具链&#xff0c;其Out-of-Tree(OOT)模块扩展机制为开发者提供了高度灵活性。本文将聚焦3.8版本下的OOT开发全流程&#xff0c;…...

别再只删特征了!用Pandas和Seaborn搞定特征共线性,我总结了3种更聪明的处理姿势

特征共线性的高阶处理&#xff1a;从数据删除到信息重构的实战进阶 在房地产价格预测项目中&#xff0c;我们常常遇到一组高度相关的特征——比如白天人口(daypop)、夜间人口(nightpop)和20-39岁夜间人口(night20-39)。传统做法是简单删除"冗余"特征&#xff0c;但这…...

NSC_BUILDER终极指南:三步解决Nintendo Switch游戏文件管理难题

NSC_BUILDER终极指南&#xff1a;三步解决Nintendo Switch游戏文件管理难题 【免费下载链接】NSC_BUILDER Nintendo Switch Cleaner and Builder. A batchfile, python and html script based in hacbuild and Nuts python libraries. Designed initially to erase titlerights…...

别再盲目备考!成人高考,职场人学历提升的省时省力方案

对于CSDN上深耕技术、奔波职场的从业者来说&#xff0c;学历提升不必“脱产内卷”&#xff0c;成人高考凭借高适配性&#xff0c;成为多数人的首选。很多职场人担心“没时间、基础差、考不过”&#xff0c;而成考恰好解决了这些核心痛点&#xff0c;轻松实现工作学习两不误。作…...

Qwen3.5-9B-AWQ-4bit实战案例:金融报表截图OCR+关键信息结构化提取

Qwen3.5-9B-AWQ-4bit实战案例&#xff1a;金融报表截图OCR关键信息结构化提取 1. 项目背景与需求分析 在金融行业日常工作中&#xff0c;分析师和业务人员经常需要处理大量报表截图。这些截图可能来自年报、季报、路演材料等各种渠道&#xff0c;包含关键财务数据和业务指标。…...

企业安全托管服务(MSS)建设实践

目前企业面临的网络威胁日益复杂&#xff0c;勒索病毒、DDoS攻击、数据泄露等安全事件频发&#xff0c;而安全人才短缺、运维成本高、防护体系碎片化等问题&#xff0c;让多数企业难以搭建自主可控的安全运营体系。在此背景下&#xff0c;企业安全托管服务&#xff08;MSS&…...

星图AI平台体验报告:训练PETRV2-BEV模型,实测效果分享

星图AI平台体验报告&#xff1a;训练PETRV2-BEV模型&#xff0c;实测效果分享 1. 项目背景与目标 BEV&#xff08;Birds Eye View&#xff09;感知技术正在成为自动驾驶领域的核心技术之一。这种技术能够将多个摄像头的视角统一转换为鸟瞰视角&#xff0c;为自动驾驶系统提供…...

OWL ADVENTURE不只是可爱!实战教程:让它成为你的网站安全守护神

OWL ADVENTURE不只是可爱&#xff01;实战教程&#xff1a;让它成为你的网站安全守护神 1. 为什么你的网站需要一只"猫头鹰守卫"&#xff1f; 在数字世界中&#xff0c;网站安全就像一座城堡的防御系统。传统的防火墙和入侵检测相当于城墙和卫兵&#xff0c;但它们…...

无人机定高不准?聊聊MS5611气压计的‘脾气’与实战避坑指南(STM32F407平台)

无人机定高不准&#xff1f;MS5611气压计的深度优化与实战避坑指南 四旋翼无人机在悬停或定高飞行时&#xff0c;高度数据跳变、定高飘忽是开发者最头疼的问题之一。气压计作为高度测量的核心传感器&#xff0c;其数据稳定性直接决定了飞行控制的品质。MS5611作为广泛采用的气…...

2026年,探寻专业AI培训公司的独特魅力与价值

在科技飞速发展的2026年&#xff0c;AI已经成为各个行业不可或缺的一部分。无论是大型企业还是初创公司&#xff0c;都在积极寻求AI人才以推动业务的创新与发展。而专业AI培训公司在这一背景下&#xff0c;展现出了独特的魅力与价值。专业AI培训公司的独特魅力紧跟前沿技术&…...

Z-Image-Turbo-辉夜巫女入门指南:专为辉夜主题设计的轻量级文生图LoRA模型解析

Z-Image-Turbo-辉夜巫女入门指南&#xff1a;专为辉夜主题设计的轻量级文生图LoRA模型解析 1. 模型简介 Z-Image-Turbo-辉夜巫女是一款基于Z-Image-Turbo模型的轻量级LoRA变体&#xff0c;专门针对"辉夜巫女"主题进行优化。这个模型能够根据简单的文字描述&#xf…...