【第十课】Rust并发编程(一)
目录
前言
Fork和Join
前言
本节会介绍Rust中的并发编程,并发编程在编程中是提升cpu使用率的一大利器,通过多线程技术提升效率,Rust的并发和其他编程语言的并发不同的地方在于,Rust号称无畏并发。更重要的一点是安全。Rust中所有权机制依然存在于多线程当中。
本节会介绍Rust中并发编程的三种方式
1.Fork和Join
2.通道
3.共享可变状态
我们一个一个来看
Fork和Join
Fork和Join在编程语言中是一种比较常见的并发模式,Fork的意思就是新开线程,Join的意思就是等待线程的结果,这是非常通用的做法,只要任务可以切分,使用Fork和Join的方式往往都会取得比较好的结果。
我们以一个简单的例子来说明,将一个String类型的vector中的元素分别计算字符串的长度,如果串型来做,就for循环vec,分别计算元素的长度,我们使用Fork和Join来实现一下。
下面的代码中,定义了5个元素的vec,在计算前还定义了一个JoinHandle的vec,然后我们循环data,使用的into_iter()表示将元素的所有权转移给迭代器,在for循环内部,使用thread::spawn启动线程,线程执行的任务使用闭包表示,比较特殊的是在闭包的开头,新增了move关键字,这是为了将所有权转移到闭包内,在这里就是循环中的变量ss,最后一个for循环,使用join等待线程执行结束。
use std::collections::HashSet;
use std::sync::Arc;
use std::thread;
use std::thread::JoinHandle;fn main() {let data: Vec<String> = vec![String::from("hello"),String::from("rust"),String::from("flink"),String::from("kafka"),String::from("hadoop"),];let mut thread_handles: Vec<JoinHandle<()>> = vec![];for ss in data.into_iter() {thread_handles.push(thread::spawn(move || {println!("{} length = {}", ss, ss.len());}));}for handle in thread_handles {handle.join().unwrap();}
}
在上面的基础上,我们加上一个小需求来感受一下,Rust的并发安全问题,我们定义一个黑词vec,当处理的词语出现在黑词中时,做特殊输出。如果是别的编程语言,非常简单,只需要让线程读取一个HashSet即可,因为只读,但是在Rust中不行,为什么呢?假设存在这样的一个HashSet,存储黑词,在主线程中定义,那么当所有者离开作用域后,HashSet会被清理,此时如果子线程依然还在读这个HashSet,就会造成问题。那么在Rust中如何解决呢?在Rust中,智能指针Arc允许一个值存在多个所有者,是一个特殊情况,当最后一个所有者离开作用域后,这块内存才会被回收。
下面代码实现了上面的功能,使用了Arc共享了所有者。下面的代码中,我们定义HashSet,并且使用Arc使这个HashSet变成可以共享所有者。并在在每个线程中都有一个变量是所有者,保证了线程读到的HashSet一定是有效的。
use std::collections::HashSet;
use std::sync::Arc;
use std::thread;
use std::thread::JoinHandle;fn main() {let data: Vec<String> = vec![String::from("hello"),String::from("rust"),String::from("flink"),String::from("kafka"),String::from("hadoop"),];let mut black_words: HashSet<String> = HashSet::new();black_words.insert(String::from("kafka"));let black_words_arc: Arc<HashSet<String>> = Arc::new(black_words);let mut thread_handles: Vec<JoinHandle<()>> = vec![];for ss in data.into_iter() {let black_word_temp_arc = Arc::clone(&black_words_arc);thread_handles.push(thread::spawn(move || {if !black_word_temp_arc.contains(&ss) {println!("{} length = {}", ss, ss.len());} else {println!("black_word")}}));}for handle in thread_handles {handle.join().unwrap();}
}
相关文章:
【第十课】Rust并发编程(一)
目录 前言 Fork和Join 前言 本节会介绍Rust中的并发编程,并发编程在编程中是提升cpu使用率的一大利器,通过多线程技术提升效率,Rust的并发和其他编程语言的并发不同的地方在于,Rust号称无畏并发。更重要的一点是安全。Rust中所有…...
图形渲染性能优化
variable rate shading conditional render 设置可见性等, 不需要重新build command buffer indirect draw glMultiDraw* - 直接支持多次绘制glMultiDrawIndirect - 间接多次绘制multithreading 多线程录制 实例化渲染 lod texture array 小对象剔除 投影到…...
elasticsearch的索引模版使用方法
5 索引模版⭐️⭐️⭐️⭐️⭐️ 索引模板就是创建索引时要遵循的模板规则索引模板仅对新创建的索引有效,已经创建的索引并不受索引模板的影响 5.1 索引模版的基本使用 1.查看所有的索引模板 GET 10.0.0.91:9200/_index_template2.创建自定义索引模板 xixi &…...
论文学习——进化动态约束多目标优化:测试集和算法
论文题目:Evolutionary Dynamic Constrained Multiobjective Optimization: Test Suite and Algorithm 进化动态约束多目标优化:测试集和算法(Guoyu Chen ,YinanGuo , Member, IEEE, Yong Wang , Senior Member, IEEE, Jing Liang , Senior …...
C++中的volatile关键字
作用: 1.它用于修饰变量,告知编译器该变量的值可能会在程序的外部被改变,编译器不能对这个变量的访问进行优化。这是因为编译器通常会对代码进行优化,例如把变量的值缓存到寄存器中,但对于 volatile 变量,…...
linux桌面qt应用程序UI自动化实现之dogtail
1. 前言 Dogtail适用于Linux 系统上进行 GUI 自动化测试,利用 Accessibility 技术与桌面程序通信;Dogtail 包含一个名为 sniff 的组件,这是一个嗅探器,用于 GUI 程序追踪; 源码下载:dogtail PyPI 可通过sudo python setup.py install安装或sudo pip install dogt…...
Hello World C#
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System; 引入了System命名空间,基本输入输出。一般只用这个,后面的不用 using System.Collections.Generic; 包含了定…...
SAP开发语言ABAP开发入门
1. 了解ABAP开发环境和基础知识 - ABAP简介 - ABAP(Advanced Business Application Programming)是SAP系统中的编程语言,主要用于开发企业级的业务应用程序,如财务、物流、人力资源等模块的定制开发。 - 开发环境搭建 - 首先需…...
应急响应靶机——easy溯源
载入虚拟机,开启虚拟机: (账户密码:zgsfsys/zgsfsys) 解题程序.exe是额外下载解压得到的: 1. 攻击者内网跳板机IP地址 2. 攻击者服务器地址 3. 存在漏洞的服务(提示:7个字符) 4. 攻击者留下的flag(格式…...
【前端】vscode报错: 无法加载文件 D:\nodejs\node_global\yarn.ps1,因为在此系统上禁止运行脚本。
vscode运行前端代码时候,执行yarn install时候报错 问题: 无法加载文件 D:\nodejs\node_global\yarn.ps1,因为在此系统上禁止运行脚本。 解决方式: 首先用管理员身份运行vscode 查看 get-ExecutionPolicy,Restrict…...
Spring Web MVC(详解中)
文章目录 Spring MVC(中)RESTFul风格设计RESTFul风格概述RESTFul风格特点RESTFul风格设计规范RESTFul风格好处RESTFul风格实战需求分析RESTFul风格接口设计后台接口实现 基于RESTFul风格练习(前后端分离模式)案例功能和接口分析功…...
Flutter:encrypt插件 AES加密处理
1、pubspec.yaml导入插件 cupertino_icons: ^1.0.8 # 密码加密 encrypt: 5.0.3encrypt封装 import package:encrypt/encrypt.dart; /// 加密类 class EncryptUtil {static final EncryptUtil _instance EncryptUtil._internal();factory EncryptUtil() > _instance;Encrypt…...
Python bytes类型及用法
在Python中,bytes类型是一种不可变的字节序列,用于存储原始的二进制数据。bytes对象通常用于处理文件、网络通信和其他需要处理原始字节数据的场景。 以下是bytes类型的一些基本用法和特性: 1. 创建bytes对象 可以通过多种方式创建bytes对…...
阅读《基于蒙特卡洛法的破片打击无人机易损性分析》_笔记
目录 基本信息 1 引言 1.1 主要研究内容 1.2 研究必要性(为什么要研究) 1.3 该领域研究现状(别人做了什么/怎么做的) 2 主要研究过程(我们做了什么) 2.1 建立目标仿真模型 2.2 确定毁伤依据 2.3 无…...
【vim】vim怎么把某一列内容复制到另一列
1. vim 怎么把某一列内容复制到另一列 移动光标到你想复制的列的第一个字符上。按下 ctrlv 进入选择模式。按下方向键选择多行。按下 h 或 j 或 k 或 l,选择整列。按下 y 复制所选择的列。移动光标到你想粘贴内容的列的第一个字符上。按下 p 粘贴内容。...
IP划分(笔记)
IPv4 32位4字节 IPv6 128位16字节 IPv4转IPv6 前10字节全0,2字节全1,再加ipv4的4个字节 IPv4划分笔记(有类域): A类:首字节必为0b0xxxxxxx 0.0.0.0/8-127.255.255.255/8 实际范围:1.0.0.1/8-126.25…...
【ChatGPT大模型开发调用】如何获得 OpenAl API Key?
如何获取 OpenAI API Key 获取 OpenAI API Key 主要有以下三种途径: OpenAI 官方平台 (推荐): 开发者用户可以直接在 OpenAI 官方网站 (platform.openai.com) 注册并申请 API Key。 通常,您可以在账户设置或开发者平台的相关页面找到申请入口。 Azure…...
人证合一开启安全认证新时代、C#人证合一接口集成、人脸识别
在数字化转型加速推进的今天,确保用户身份的真实性和唯一性成为了各行各业关注的重点。从金融交易到在线教育,从远程办公到智慧医疗,如何高效准确地验证“你是你”变得至关重要。正是在这种背景下,翔云“人证合一”接口应运而生&a…...
EBS 中 Oracle Payables (AP) 模块的相关集成
Oracle E-Business Suite (EBS) 中的 Oracle Payables (AP) 模块是一个全面的应付账款管理系统,它不仅提供了丰富的功能来管理与供应商的财务交易,还通过与其他模块的紧密集成,实现了企业内部各个业务流程的无缝衔接。以下是 Oracle Payables…...
Flask项目入门—会话技术Cookie和Session
Session和Cookie都是用于跟踪用户会话的技术、它们可以存储用户信息,以便在用户与网站进行交互时提供个性化的体验。然而,这两者在存储位置、使用方式、安全性等方面存在显著的差异。 工作原理/流程 Cookie 1、用户第一次访问时候服务器生成 Cookie&a…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
