57 C++ promise 在某一个线程中给A = 赋值,然后其他线程中可以获得这个A 的赋值

零 场景分析:

假设我们需要有一个线程是搞算法的,且每次需要场景的不同去算一次,这个算法花费的时间比较长。

一 promise C++中文档的说明

std::promise在标头 <future> 定义template< class R > class promise;(1) (C++11 起) template< class R > class promise<R&>;(2) (C++11 起) template<>          class promise<void>;(3) (C++11 起) 1) 空模板2) 非 void 特化,用于在线程间交流对象3) void 特化,用于交流无状态事件类模板 std::promise 提供存储值或异常的设施,之后通过 std::promise 对象所创建的 std::future 对象异步获得结果。注意 std::promise 只应当使用一次。每个 promise 与共享状态关联,共享状态含有一些状态信息和可能仍未求值的结果,它求值为值(可能为 void )或求值为异常。 promise 可以对共享状态做三件事:
◦使就绪: promise 存储结果或异常于共享状态。标记共享状态为就绪,并解除阻塞任何等待于与该共享状态关联的 future 上的线程。
◦释放: promise 放弃其对共享状态的引用。若这是最后一个这种引用,则销毁共享状态。除非这是 std::async 所创建的未就绪的共享状态,否则此操作不阻塞。
◦抛弃: promise 存储以 std::future_errc::broken_promise 为 error_code 的 std::future_error 类型异常,令共享状态为就绪,然后释放它。promise 是 promise-future 交流通道的“推”端:存储值于共享状态的操作同步于(定义于 std::memory_order )任何在共享状态上等待的函数(如 std::future::get )的成功返回。其他情况下对共享状态的共时访问可能冲突:例如, std::shared_future::get 的多个调用方必须全都是只读,或提供外部同步。

二 普通顺序调用启动

三 普通函数线程启动

四 类成员函数线程启动

class Teacher179 {
public:mutex mymutex;list<int> mylist;public:int readfunc(string &tempstr) {for (size_t i = 0; i < 10; i++){mymutex.lock();cout << "read func tempstr = " << tempstr << "  i = " << i << " threadid = " << this_thread::get_id() << "  &tempstr = " << &tempstr << "  tempstr = " << tempstr << endl;mymutex.unlock();}return 10;}int writefunc(const int &tempdouble) {for (size_t i = 0; i < 10; i++){mymutex.lock();cout << "write func tempdouble = " << tempdouble << "  i = " << i << " threadid = " << this_thread::get_id() << "  &tempdouble = " << &tempdouble << "   tempdouble = " << tempdouble << endl;mymutex.unlock();}return (int)tempdouble;}double promisefunc(promise<int> &resultint, string strsource) {cout << "teacher179 promisefunc start " << endl;// 计算完毕后,我们假设计算结果是1000,给resultint赋值resultint.set_value(1000);cout << "teacher179 promisefunc end " << endl;return 3.14;}public:Teacher179() {cout << "Teacher179 构造方法被执行" << endl;}~Teacher179() {cout << "Teacher179 析构方法被执行" << endl;}Teacher179(const Teacher179& tea) {cout << "Teacher179 copy 构造 被执行" << endl;}
};//该方法,返回值是double,参数是string,在函数内部可以给一个 int赋值。赋值后的数据可以通过 resultint的实参.getfuture()获得
double promisefunc(promise<int> &resultint,string strsource) {cout << "promisefunc start " << endl;// 计算完毕后,我们假设计算结果是1000,给resultint赋值resultint.set_value(1000);cout << "promisefunc end " << endl;return 3.14;
}// promise ,在某一个线程中给A 赋值,然后其他线程中可以使用这个A 的值
void main() {//直接调用promise<int> promi;promisefunc(promi, "nihao");future<int> fu = promi.get_future();cout << fu.get() << endl;//启动线程调用string str2 = "how are you";promise<int> promi2;thread mythread10(promisefunc,ref(promi2),str2);mythread10.join();future<int> fu5 = promi2.get_future();cout<<fu5.get()<<endl;//async 线程启动 string str3 = "chinabank";promise<int> promi3;//注意,这里ayync的返回值是线程入口启动函数的返回值是double, //promi3.get_future()的返回值是线程中想要赋值的数据的返回值future<double> fu6 = async(launch::async, promisefunc, ref(promi3), ref(str3));future<int> fu7 = promi3.get_future();cout << fu6.get() << endl;;cout << fu7.get() << endl;;//类成员函数cout << "teacher179start" << endl;string str10 = "teacher179";promise<int> promi100;Teacher179 tea;thread mythread100(&Teacher179::promisefunc, &tea, ref(promi100), ref(str10));mythread100.join();cout<<promi100.get_future().get()<<endl;cout << "teacher179start2" << endl;string str11 = "teacher179111";promise<int> promi11;Teacher179 tea1;future<double> fu11 = async(launch::async, &Teacher179::promisefunc, &tea, ref(promi11), ref(str11));future<int> fu12 = promi11.get_future();cout << fu11.get() << endl;cout << fu12.get() << endl;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/636369.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[C#]winform部署yolov8图像分类的openvino格式的模型

【官方框架地址】 https://github.com/ultralytics/ultralytics 【openvino介绍】 OpenVINO是一个针对Intel硬件优化的开源工具包&#xff0c;用于优化和部署深度学习模型。以下是OpenVINO部署模型的主要优点&#xff1a; 高性能&#xff1a;OpenVINO提供了一系列性能优化工…

Flask 3.x log全域配置(包含pytest)

最近使用到flask3.x&#xff0c;配置了全域的log&#xff0c;这边记录下 首先需要创建logging的配置文件&#xff0c;我是放在项目根目录的&#xff0c; Logging 配置 logging.json {"version": 1, # 配置文件版本号"formatters": {"default&qu…

HTTP 协议和 TCP/IP 协议之间有什么区别?

HTTP&#xff08;超文本传输协议&#xff09;和TCP/IP&#xff08;传输控制协议/互联网协议&#xff09;是两种在互联网通信中广泛使用的协议&#xff0c;它们之间的区别和联系对许多人来说可能还不是很清晰&#xff0c;今天我们就带大家来一起了解一下HTTP和TCP/IP协议这2者之…

java数据结构与算法刷题-----LeetCode566. 重塑矩阵

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 法一&#xff0c;下标填充2. 法二&#xff1a;数学除法和取余…

MFC 序列化机制

目录 文件操作相关类 序列化机制相关类 序列化机制使用 序列化机制执行过程 序列化类对象 文件操作相关类 CFile&#xff1a;文件操作类&#xff0c;封装了关于文件读写等操作&#xff0c;常见的方法&#xff1a; CFile::Open&#xff1a;打开或者创建文件CFile::Write/…

墨菲定律治好了我的焦虑

墨菲定律&#xff1a;越怕什么&#xff0c;越发生什么 推论&#xff1a;越害怕什么&#xff1f;就越准备什么&#xff0c;那样发生什么都不需要害怕。 墨菲定律确实揭示了一种有趣的现象&#xff0c;即对某事的过度担忧可能会吸引这个事情发生。这一观点促使我们考虑如何通过…

Mongo集群入门

一、前言 MongoDB 有三种集群架构模式&#xff0c;分别为主从复制&#xff08;Master-Slaver&#xff09;、副本集&#xff08;Replica Set&#xff09;和分片&#xff08;Sharding&#xff09;模式。 Master-Slaver 是一种主从复制的模式&#xff0c;目前已经不推荐使用。 Re…

24秋招总结-抓住每一次可能的机会

漫长而又煎熬的秋招从1月11日签约后正式落下了帷幕&#xff0c;在长达近六个月的时间里&#xff0c;每个月都是不同的心态&#xff0c;以此篇总结记录下我的秋招。 首先概述一下秋招的最终结果&#xff0c;我是在七月份开始投递的&#xff0c;正式结束秋招在一月初&#xff0c…

大模型:我也会自监督学习~

前言 当下大模型的能力已经很强了&#xff0c;但是将来我们想要的是能力更强的大模型&#xff0c;其最好能够处理各种复杂问题也即强对齐模型。 之前大模型训练的监督信号主要来源于人类反馈&#xff0c;但是如果想要训练一个强对齐模型必然就需要一个对应的强监督信号&#…

Jira REST API_创建共享配置的Jira项目

概述 提供使用 REST API 在 Jira 中创建具有共享配置的新 Jira 项目的解决方案 解决方案 要使用 REST API 创建具有共享配置的新项目&#xff0c;请按照以下步骤操作&#xff1a; 获取用作共享配置源的项目的ID。 - a. 在Project settings中的 Details 上&#xff0c;悬停鼠…

WebDriverWait太强大

selenium webdriver及wait 1 implicitly包打天下2 Linkedin无法登录返回值很乱&#xff0c;怎么破&#xff1f; 1 implicitly包打天下 有了implicitly之后&#xff0c;基本上不再关注网速之类的影响。 self.driver.implicitly_wait(511)2 Linkedin无法登录返回值很乱&#xf…

探索图像检索:从理论到实战的应用

目录 一、引言二、图像检索技术概述图像检索的基本概念图像检索与文本检索的区别特征提取技术相似度计算索引技术 三、图像检索技术代码示例图像特征提取示例相似度计算索引技术 四、图像搜索流程架构数据采集与预处理特征提取相似度计算与排名结果呈现与优化 五、实际应用图像…

【征服redis11】花了一天,我终于懂了redis的底层数据结构

现在我们可以开始讨论一个硬核问题了—Redis的数据结构。在redis里常见的数据类型有String、Hash、Set、List、Zset五种常用结构&#xff0c;另外还有Hyperloglog、Geo、Streams等结构。这些结构的特征和应用场景我们在前面都介绍过&#xff0c;这里我们来研究一下其内部结构是…

【分布式技术】ELK大型日志收集分析系统

目录 步骤一&#xff1a;完成JAVA环境部署 步骤二&#xff1a;部署ES节点&#xff08;三台主机&#xff09; 步骤三&#xff1a;内核参数修改 步骤四&#xff1a;web端查看验证 步骤五&#xff1a;yum安装nginx 步骤六&#xff1a;完成logstash部署 步骤七&#xff1a;部…

荣誉艾尔迪亚人的题解

目录 原题描述&#xff1a; 题目背景 题目描述 输入格式 输出格式 样例 Input 1 Output 1 Input 2 Output 2 数据范围&#xff1a; 样例解释 主要思路&#xff1a; 代码code&#xff1a; 原题描述&#xff1a; 时间限制: 1000ms 空间限制: 65536kb 题目背景 ​…

Python爬虫时被封IP,该怎么解决?四大动态IP平台测评

在使用 Python 进行爬虫时&#xff0c;很有可能因为一些异常行为被封 IP&#xff0c;这主要是因为一些爬虫时产生的异常行为导致的。 在曾经的一次数据爬取的时候&#xff0c;我尝试去爬取Google地图上面的商家联系方式和地址信息做营销&#xff0c;可是很不幸&#xff0c;还只…

从规则到神经网络:机器翻译技术的演化之路

文章目录 从规则到神经网络&#xff1a;机器翻译技术的演化之路一、概述1. 机器翻译的历史与发展2. 神经机器翻译的兴起3. 技术对现代社会的影响 二、机器翻译的核心技术1. 规则基础的机器翻译&#xff08;Rule-Based Machine Translation, RBMT&#xff09;2. 统计机器翻译&am…

【内存管理】flink内存管理(一):内存管理概述:flink主动管理内存原理、flink内存模型

文章目录 一.flink为什么自己管理内存1. 处理大数据时JVM内存管理的问题2. flink主动管理内存逻辑2.1. Flink内存管理方面2.2. 序列化、反序列化说明 3. Flink主动管理内存的好处 二. Flink内存模型1. 堆内存2. 非堆内存2.1. 托管内存2.2.直接内存2.3. JVM特定内存 本节从整体使…

Nginx重写功能location与rewrite

1. location 从功能看 rewrite 和 location 似乎有点像&#xff0c;都能实现跳转&#xff0c;主要区别在于 rewrite 是在同一域名内更改获取资源的路径&#xff0c;而 location 是对一类路径做控制访问或反向代理&#xff0c;还可以proxy_pass 到其他机器。 rewrite 对访问的…

书生·浦语大模型实战营-学习笔记4

XTuner 大模型单卡低成本微调实战 Finetune简介 常见的两种微调策略&#xff1a;增量预训练、指令跟随 指令跟随微调 数据是一问一答的形式 对话模板构建 每个开源模型使用的对话模板都不相同 指令微调原理&#xff1a; 由于只有答案部分是我们期望模型来进行回答的内容…