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

Studying-多线程学习Part4 - 异步并发——async future、packaged_task、promise

异步并发——async future packaged_task promise

1.async、future

是C++11引入的一个函数模版,用于异步执行一个函数,并返回一个future对象,表示异步操作的结果。使用 async 可以方便地进行异步编程,避免了手动创建线程和管理线程的麻烦。 

代码参考:

#include<iostream>
#include<future>
#include<thread>
using namespace std;int func() {int i = 0;for (int j = 0; j < 1000; ++j) {i++;}return i;
}int main() {future<int> future_result = async(launch::async, func);cout << func() << endl;cout << future_result.get() << endl;return 0;
}

这个例子中,使用了async函数异步执行了一个耗时的计算,这个计算可以在另一个线程中执行,不会阻塞主线程。同时,我们也避免了手动创建线程和管理线程的麻烦。

2.packaged_task 

在C++中,packaged_task是一个类模板,用于将一个可调用对象(如函数、函数对象或Lambda表达式)封装成一个异步撮作,并返回一个std::future对象,表示异步操作的结果。packaged_task可以方便地将一个函数或可调用对象转换成一个异步操作,供其他线程使用。

代码参考:

#include<iostream>
#include<future>
#include<thread>
using namespace std;int func() {int i = 0;for (int j = 0; j < 1000; ++j) {i++;}return i;
}int main() {packaged_task<int()> task(func);future<int>future_result = task.get_future();thread t1(move(task));cout << func() << endl;t1.join();cout << future_result.get() << endl;return 0;
}

在这个例子中,我们成功地将一个函数封装成了一个异步操作,并在其他线程中执行。通过packaged_task和future对象,我们可以方便地实现异步编程,使得代码更加简洁和易于维护。 

3.promise

在C++中,promise是一个类模版,用于在一个线程中产生一个值,并在另一个线程中获取这个值。promise通常与future和async一起使用,用于实现异步编程。

#include<iostream>
#include<future>
using namespace std;void fun(promise<int>& f) {f.set_value(1000); //传入数据
}int main() {promise<int> f;auto future_result = f.get_future();thread t1(fun, ref(f));t1.join();cout << future_result.get() << endl;return 0;}

实现一个数据的传入和使用。 


原子操作 atomic

`std::atomic` 是 C++11 标准库中的一个模板类,用于实现多线程环境下的原子操作。它提供了一种线程安全的方式来访问和修改共享变量,可以避免多线程环境中的数据竞争问题。

`std::atomic` 的使用方式类似于普通的 C++ 变量,但是它的操作是原子性的。也就是说,在多线程环境下,多个线程同时对同一个 `std::atomic` 变量进行操作时,不会出现数据竞争问题。

以下是一些常用的 `std::atomic` 操作:

  1. `load()`:将 `std::atomic` 变量的值加载到当前线程的本地缓存中,并返回这个值。
  2. `store(val)`:将 `val` 的值存储到 `std::atomic` 变量中,并保证这个操作是原子性的。
  3. `exchange(val)`:将 `val` 的值存储到 `std::atomic` 变量中,并返回原先的值。
  4. `compare_exchange_weak(expected, val)` 和 `compare_exchange_strong(expected, val)`:比较 `std::atomic` 变量的值和 `expected` 的值是否相同,如果相同,则将 `val` 的值存储到 `std::atomic` 变量中,并返回 `true`;否则,将 `std::atomic` 变量的值存储到 `expected` 中,并返回 `false`。

代码参考:

#include<iostream>
#include<thread>
#include<atomic>
using namespace std;//原子量
atomic<int> sharted_data = 0;
void func() {for (int i = 0; i < 10000; ++i) {sharted_data++; //对原子量数据操作是线程安全的 }
}
int main() {thread t1(func);thread t2(func);t1.join();t2.join();cout << sharted_data << endl;return 0;
}

相关文章:

Studying-多线程学习Part4 - 异步并发——async future、packaged_task、promise

异步并发——async future packaged_task promise 1.async、future 是C11引入的一个函数模版&#xff0c;用于异步执行一个函数&#xff0c;并返回一个future对象&#xff0c;表示异步操作的结果。使用 async 可以方便地进行异步编程&#xff0c;避免了手动创建线程和管理线程…...

【Java基础】用Scanner类获取控制台输入

目录 Scanner类是什么导入并创建读取一个数读取字符串读取一行读取直到空白字符为止读取多个数直到^z读取一个字符 Scanner类是什么 在Java中&#xff0c;Scanner 是一个非常有用的类&#xff0c;用于从各种输入源&#xff08;如键盘、文件或其他输入流&#xff09;读取数据。…...

微服务seata解析部署使用全流程

官网地址&#xff1a; Seata 是什么&#xff1f; | Apache Seata 1、Seata术语 用来管理分布式事务&#xff0c;由阿里巴巴出品。 【1、TC (Transaction Coordinator) - 事务协调者】 用来维护事务的&#xff0c;包括主事务和分支事务。 【2、TM (Transaction Manager) - …...

Linux性能调优技巧

目录 前言1. CPU性能优化1.1 调整CPU调度策略1.2 合理分配多核处理 2. 内存性能优化2.1 调整内存分配策略2.2 缓存和分页优化 3. 磁盘I/O性能优化3.1 使用合适的I/O调度器3.2 磁盘分区和文件系统优化 4. 网络性能优化4.1 优化网络参数4.2 调整网络拥塞控制算法 5. 系统监控与优…...

python 实现sha1算法

sha1算法介绍 SHA-1&#xff08;Secure Hash Algorithm 1&#xff0c;安全散列算法1&#xff09;是一种密码散列函数&#xff0c;由美国国家安全局&#xff08;NSA&#xff09;设计&#xff0c;并由美国国家标准技术研究所&#xff08;NIST&#xff09;发布为联邦数据处理标准…...

ejb-ref元素

ejb-ref 是用于在 Java EE (现在称为 Jakarta EE) 中引用 Enterprise JavaBeans (EJB) 的一个元素&#xff0c;主要用于定义和配置 SLEE (Service Logic Execution Environment) 组件中的 EJB 依赖关系。通过这个引用&#xff0c;SBB (Service Building Block) 可以轻松地访问和…...

Perl 子程序(函数)

Perl 子程序&#xff08;函数&#xff09; Perl 是一种高级、解释型、动态编程语言&#xff0c;广泛用于CGI脚本、系统管理、网络编程、 finance, bioinformatics, 以及其他领域。在Perl中&#xff0c;子程序&#xff08;也称为函数&#xff09;是组织代码和重用代码块的重要方…...

ElasticSearch 备考 -- Snapshot Restore

一、题目 备份集群下的索引 task&#xff0c;存储快照名称为 snapshot_1 二、思考 这个涉及的是集群的备份&#xff0c;主要是通过创建快照&#xff0c;涉及到以下2步骤 Setp1&#xff1a;注册一个备份 snapshot repository Setp2&#xff1a;创建 snapshot 可以通过两种方…...

【Linux】进程替换、命令行参数及环境变量(超详解)

目录 进程替换 替换函数的含义 命令行参数 环境变量 PATH 进程替换 我们先看代码&#xff1a; 1 #include<stdio.h>2 #include<unistd.h>3 int main()4 {5 printf("process...begin!\n");6 7 execl("/usr/bin/ls","ls"…...

MySQL事务日志—redo日志介绍

MySQL事务日志—redo日志 事务有4种特性&#xff1a; 原子性、一致性、隔离性和持久性。 那么事务的四种特性到底是基于什么机制实现? 事务的原子性、一致性由事务的 undo 日志事务的隔离性由锁机制和MVCC实现。事务的持久性由redo 日志来保证。 两类日志概述&#xff1a;…...

告别音乐小白!字节跳动AI音乐创作工具,让你一键变作曲家!

还在羡慕别人能创作动听的音乐&#xff1f;五音不全的你&#xff0c;也梦想着谱写属于自己的乐章&#xff1f;现在&#xff0c;机会来了&#xff01;字节跳动推出了一款AI音乐创作工具——抖音推出的海绵音乐&#xff0c;它能让你轻松一键创作音乐&#xff0c;即使是“音乐小白…...

空心正方形图案

KiKi学习了循环&#xff0c;BoBo老师给他出了一系列打印图案的练习&#xff0c;该任务是打印用“*”组成的“空心”正方形图案。 输入描述&#xff1a; 多组输入&#xff0c;一个整数(3~20)&#xff0c;表示输出的行数&#xff0c;也表示组成正方形边的“ * ”的数量。 输出描述…...

【EXCEL数据处理】000020 案例 保姆级教程,附多个操作案例。EXCEL使用表格。

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【EXCEL数据处理】000020 案例 保姆级教程&#xff0c;附多个操作案例。…...

虾皮Shopee大数据面试题及参考答案

Cube 表性能优化,还有其他优化的方法吗? Cube 表性能优化可以从多个方面入手。 一方面,可以优化数据存储格式。选择合适的存储格式能够减少存储空间占用,提高数据读取速度。例如,Parquet 格式是一种高效的列式存储格式,它可以按列进行数据压缩,大大减少磁盘 I/O 和内存占…...

重学SpringBoot3-集成Redis(六)之消息队列

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成Redis&#xff08;六&#xff09;之消息队列 1. 什么是发布/订阅&#xff08;Pub/Sub&#xff09;&#xff1f;2. 场景应用3. Spring Boot 3 整合 R…...

LeetCode 134 Gas Station 解题思路和python代码

题目&#xff1a; There are n gas stations along a circular route, where the amount of gas at the ith station is gas[i]. You have a car with an unlimited gas tank and it costs cost[i] of gas to travel from the ith station to its next (i 1)th station. You …...

服务攻防

171、一次完整的 HTTP 请求过程 域名解析 --> 发起 TCP 的 3 次握手 --> 建立 TCP 连接后发起 http 请求 --> 服务器 响应 http 请求&#xff0c;浏览器得到 html 代码 --> 浏览器解析 html 代码&#xff0c;并请求 html 代码中的资源&#xff08;如 js、 css…...

leetcode 力扣算法题 快慢指针 双指针 19.删除链表的倒数第n个结点

删除链表的倒数第N个结点 题目要求题目示例解题思路从题目中的已知出发思考寻找目标结点条件转换核心思路 需要注意的点改进建议 完整代码提交结果 题目要求 给你一个链表&#xff0c;删除链表的倒数第n个结点&#xff0c;并且返回链表的头结点。 题目示例 示例 1&#xff1…...

网络五层模型:物理层、数据链路层、网络层、传输层、应用层,分别解决了什么问题?

网络五层模型&#xff08;也称为TCP/IP模型的简化版本&#xff09;将网络通信过程分为五个层次&#xff0c;每一层都解决了特定的问题。以下是每一层的详细解释及其解决的问题&#xff1a; 1. 物理层&#xff08;Physical Layer&#xff09; 解决的问题&#xff1a;数据的物理…...

OpenCV视频I/O(18)视频写入类VideoWriter之初始化 VideoWriter 对象的函数open()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 初始化或重新初始化视频编写器。 该方法打开视频编写器。参数与构造函数 VideoWriter::VideoWriter 中的相同。 cv::VideoWriter::open() 函数用…...

PaperDebugger:解决机器学习代码复现危机的调试框架

1. 项目概述&#xff1a;当代码遇上论文&#xff0c;一场“可复现性”的硬仗如果你和我一样&#xff0c;常年混迹在机器学习、数据科学或者计算物理这类前沿领域&#xff0c;那你一定对下面这个场景不陌生&#xff1a;读到一篇顶会论文&#xff0c;作者声称他们的模型在某个基准…...

Node.js后端框架Hereetria:平衡灵活性与约定,构建现代化Web应用

1. 项目概述与核心价值 最近在折腾一个挺有意思的开源项目&#xff0c;叫“Hereetria”。这个名字听起来有点陌生&#xff0c;但如果你对构建现代化的、可扩展的Web应用后端架构感兴趣&#xff0c;那它绝对值得你花时间研究一下。简单来说&#xff0c;Hereetria是一个基于Node.…...

基于树莓派与电子墨水屏的慢速电影播放器制作全攻略

1. 项目概述&#xff1a;当电影遇见电子墨水如果你和我一样&#xff0c;对电子墨水&#xff08;eInk&#xff09;屏幕那种独特的、像印刷品一样的显示效果着迷&#xff0c;同时又是个喜欢折腾树莓派&#xff08;Raspberry Pi&#xff09;的玩家&#xff0c;那么这个项目绝对能让…...

终极指南:如何快速解决LaTeX中文排版字体问题

终极指南&#xff1a;如何快速解决LaTeX中文排版字体问题 【免费下载链接】latex-chinese-fonts Simplified Chinese fonts for the LaTeX typesetting. 项目地址: https://gitcode.com/gh_mirrors/la/latex-chinese-fonts 还在为LaTeX中文排版时遇到的字体缺失、样式混…...

TikTokDownload:5分钟掌握抖音去水印批量下载终极方案

TikTokDownload&#xff1a;5分钟掌握抖音去水印批量下载终极方案 【免费下载链接】TikTokDownload 抖音去水印批量下载用户主页作品、喜欢、收藏、图文、音频 项目地址: https://gitcode.com/gh_mirrors/ti/TikTokDownload 想要轻松保存抖音上的精彩内容却苦于官方水印…...

Kubernetes自动化运维最佳实践

Kubernetes自动化运维最佳实践 引言 自动化运维是云原生环境中的重要能力&#xff0c;它可以提高运维效率、减少人为错误、确保系统稳定性。本文将深入探讨Kubernetes中的自动化运维策略和最佳实践。 一、自动化运维架构 1.1 自动化运维层次 ┌────────────────…...

ElevenLabs成年男性语音定制全流程(含Stability Score阈值表+Voice Embedding相似度热力图)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ElevenLabs成年男性语音定制的核心价值与适用边界 ElevenLabs 的成年男性语音定制能力&#xff0c;本质上是通过深度神经声码器与说话人嵌入&#xff08;speaker embedding&#xff09;联合建模实现的高…...

别再只跑Demo了!用Mask R-CNN和Balloon数据集实战,手把手教你从训练到可视化调参

从Demo到实战&#xff1a;用Mask R-CNN深入掌握目标分割全流程 当你第一次运行Mask R-CNN的官方示例时&#xff0c;那种"成功运行"的喜悦往往伴随着隐约的不安——代码虽然跑通了&#xff0c;但你真的理解模型是如何训练的吗&#xff1f;Balloon数据集作为经典的入门…...

基于eNSP的园区网络高可用与安全隔离综合实验

1. 实验背景与核心价值 园区网络作为企业数字化转型的基础设施&#xff0c;其稳定性和安全性直接关系到日常运营效率。记得去年参与某金融机构网络改造项目时&#xff0c;他们的核心业务系统因为单点故障导致全网瘫痪4小时&#xff0c;直接损失超过百万。这个案例让我深刻认识到…...

如何为 Claude Code 配置 Taotoken 的稳定 API 连接

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 如何为 Claude Code 配置 Taotoken 的稳定 API 连接 Claude Code 作为一款强大的 AI 编程助手&#xff0c;其原生服务在某些地区可…...