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

【Rust】Shared-State Concurrency

Shared-State Concurrency

channel类似于single ownership. 而shared memory类似与multiple ownership. multiple ownership是难于管理的. smarter pointer也是multiple ownership的.

Rust的type system和ownership rules帮助实现正确的multiple ownership管理。

Using Mutexes to Allow Access to Data from One Thread at a Time

Mutex是mutual exclusion的缩写。mutex内部有一个锁,访问数据前,先持有锁,其他线程就不能再访问这个数据了。mutex通过locking system来实现对数据的保护。

使用mutex的两条规则:

  • 访问数据前要先持有锁;
  • 访问数据后,要记得释放锁,这样其他线程才能访问该数据。

Rust的type system和ownership rule,保证了mutex的正确使用。

The API of Mutex

Mutex<T>是智能指针;其lock()成员返回类型为MutexGuard的智能指针;MutexGuard实现了Deref接口来获取其内部数据;也实现了Drop接口来释放其内部的锁。

Sharing a Mutex Between Multiple Threads

我们无法把mutex的所有权move到多个线程中。所以需要借用引用计数的方式来实现多个所有权。

Multiple Ownership with Multiple Threads

Rc<T>在多线程中共享是非安全的。Rc<T>clone接口被调用时,它将引用计数加一;当其克隆消亡时,它将引用计数减一。但是,Rc<T>没有提供原子操作行为,多线程并发时,有可能发生Rc<T>的引用计数被同时修改。

所以,需要一种具有原子操作能力的RC.

Atomic Reference Counting with Arc

atomically reference counted

为什么所有的基本类型不实现为原子操作的呢?因为这样做有性能损失。

示例代码:

use std::sync::{Arc, Mutex};
use std::thread;fn main() {let counter = Arc::new(Mutex::new(0));let mut handles = vec![];for _ in 0..10 {let counter = Arc::clone(&counter);let handle = thread::spawn(move || {let mut num = counter.lock().unwrap();*num += 1;     });handles.push(handle);}for handle in handles {handle.join().unwrap();}println!("Resule {}", *counter.lock().unwrap());}

Similarities Between RefCell/Rc and Mutex/Arc

Mutex<T>并不能防止逻辑错误,如死锁(两个线程互相等待对方持有的锁释放)。

参考资料

Shared-State Concurrency - The Rust Programming Language (rust-lang.org)

相关文章:

【Rust】Shared-State Concurrency

Shared-State Concurrency channel类似于single ownership. 而shared memory类似与multiple ownership. multiple ownership是难于管理的. smarter pointer也是multiple ownership的. Rust的type system和ownership rules帮助实现正确的multiple ownership管理。 Using Mute…...

连接数据库(MySQL)的JDBC

目录 JDBC简介快速入门API详解DriverManager&#xff08;驱动管理类&#xff09;注册驱动&#xff1a;获取数据库连接(对象)&#xff1a; Connection&#xff08;数据库连接对象&#xff09;获取执行SQL的对象管理事务 Statement(执行SQL语句)执行DML、DDL语句执行DQL语句 Resu…...

golang通过参数控制HTTP server是否使用基本认证

之前写的《golang实现一个BasicAuth的HTTP server》一定会做基本认证。 本例给出了如何通过启动时候指定的参数来控制是否做基本认证 代码对比和解释 给出与上一篇中源码的diff adminhpc-1:~/go/auth_http$ diff -ruN http_rpc_server.go_bak http_rpc_server.go --- http_rp…...

javaSwing坦克大战游戏

在游戏开发领域&#xff0c;坦克大战是一款经典的游戏&#xff0c;其简单而又耐玩的玩法吸引了无数玩家。而今&#xff0c;在Java编程技术的支持下&#xff0c;我们可以用Java Swing技术轻松实现这款经典游戏。本文将介绍如何使用Java Swing技术编写坦克大战游戏&#xff0c;并…...

【面试题】数据底层原理:Elasticsearch写入流程解析

前言&#xff1a;本篇博客将介绍Elasticsearch的数据底层原理&#xff0c;涉及数据写入的过程以及相关概念。我们将深入探讨buffer、translog、refresh、commit、flush和merge等核心概念&#xff0c;帮助您更好地理解Elasticsearch的数据存储机制。 写入数据的基本过程 Elast…...

牛客论坛spring initializer选用的构件

spring版本&#xff1a;2.1.5.RELEASE java版本&#xff1a;8 pom文件&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-i…...

【Java程序设计】【C00385】基于(JavaWeb)Springboot的员工信息管理系统(有论文)

基于&#xff08;JavaWeb&#xff09;Springboot的员工信息管理系统 项目简介项目获取开发环境项目技术运行截图 博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c…...

【Linux进阶之路】理解UDP,成为TCP。

前言 学了TCP 和UDP之后&#xff0c;感觉UDP就像是初入职场的年轻人&#xff0c;两耳不闻 “窗外事”&#xff0c;只管尽力地把自己的事情做好&#xff0c;但收获的却是不可靠&#xff0c;而TCP更像是涉世极深的"职场老油条"&#xff0c;给人的感觉就是 “城府极深&a…...

Linux实用操作

一&#xff0c;各类小技巧&#xff08;快捷键&#xff09; 强制停止 ctrlc强制停止 Linux某些程序的运行&#xff0c;如果想要强制停止它&#xff0c;可以使用快捷键ctrlc 命令输入错误,也可以通过快捷键ctrlc,退出当前输入,重新输入 退出、登出 ctrld退出或登出 可以通过快…...

OpenJudge - 12:加密的病历单

总时间限制: 1000ms 内存限制: 65536kB 描述 小英是药学专业大三的学生&#xff0c;暑假期间获得了去医院药房实习的机会。 在药房实习期间&#xff0c;小英扎实的专业基础获得了医生的一致好评&#xff0c;得知小英在计算概论中取得过好成绩后&#xff0c;主任又额外交给她一…...

QGIS编译(跨平台编译)057:FastCGI编译(Windows、Linux、MacOS环境下编译)

文章目录 1、FastCGI介绍2、FastCGI下载3、Windows下编译4、linux下编译5、MacOS下编译1、FastCGI介绍 FCGI 是 FastCGI 的缩写,是一种用于改善 CGI(Common Gateway Interface)性能的协议。在传统的 CGI 中,每次请求都需要启动一个新的进程来处理,这导致了较高的资源消耗和…...

jenkins+newman+postman持续集成环境搭建

一、Newman简介 Newman是一款基于Node.js开发的&#xff0c;可以运用postman工具直接从命令运行和测试postman集合 二、Newman应用 环境准备&#xff1a;js/ cnpm或npm配置好环境&#xff0c;执行如下命令 三、安装newman 验证是否安装成功&#xff0c;命令&#xff1a;newm…...

取消自动设置的开机自启动(pywin32库)请勿仿照!否则可能对电脑造成损害。

本文使用创作助手。 要取消Python程序的开机自启动&#xff0c;可以通过删除注册表中相应的注册表项来实现。请按照以下步骤进行操作&#xff1a; 打开Windows注册表编辑器&#xff1a;按下 Windows R 键&#xff0c;输入 regedit&#xff0c;然后按下回车键。 导航到注册表…...

金融投贷通(金融投资+贷款通)项目准备

金融投贷通&#xff08;金融投资贷款通&#xff09;项目准备 专业术语投资专业术语本息专业术语还款专业术语项目介绍三个子系统技术架构核心流程发布借款标投资业务 项目实施测试流程测试步骤 专业术语 投资专业术语 案例&#xff1a;张三借给李四5W&#xff0c;约定期满1年后…...

跟我学C++中级篇——STL的中的删除

一、介绍 在STL中一般删除的方式有两类&#xff0c;一种是使用全局的std::remove(remove_if类似)&#xff0c;一种是使用容器自带的erase&#xff0c;前者其实并没有真正的删除数据&#xff0c;而后者则是在移动时&#xff0c;会有一些细节的处理&#xff0c;否则要么程序崩溃…...

js如何遍历查询一个颗树

近段时间去面试的时候&#xff0c;被面试官问到如何遍历查询一个颗树的时候&#xff0c;可能最近自己看了数据结构的书之后&#xff0c;隐隐约约就想到二叉树的三种排序&#xff08;前序、中序、后序&#xff09;&#xff0c;但是当时自己没有想起这三种排序的名字&#xff0c;…...

【面试必备】针对一个案例,怎么测试

思考角度 测试用例设计万能公式功能测试&#xff08;最重要&#xff09;界面测试易用性测试性能测试安全性测试兼容性测试容错性测试 常见案例物品类水杯笔 软件类微信发送朋友圈功能 测试用例设计万能公式 在面试中经常会遇到的一类题是&#xff0c;给你一个具体的产品&#…...

vue3 hooks之事件广播(支持跨标签页)

/**** 同源下的全局事件总线&#xff0c;支持跨标签页通信* 第一步&#xff1a;注册事件* 第二步&#xff1a;广播事件* 第三步&#xff1a;处理事件*/// source&#xff1a;消息发起源href&#xff0c;将在跨标签页通信时传入 interface callback {(data: any, source: any): …...

go中validate包使用教程

文章目录 前言安装简单使用错误处理翻译器Validator库介绍校验语法常用标记自定义校验需求【校验车身颜色】前言 在go项目中,经常有校验数据合法性的需求,比如邮箱、年龄、车牌号、网址、字符串长度、金额、枚举范围等。一个好的校验包能帮我们少写很多ifelse,提高系统的可…...

canvas画带透明度的直线和涂鸦

提示&#xff1a;canvas画线 文章目录 前言一、带透明度的直线和涂鸦总结 前言 一、带透明度的直线和涂鸦 test.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content…...

Anno 1800模组加载器完全掌握指南:从安装到创意开发

Anno 1800模组加载器完全掌握指南&#xff1a;从安装到创意开发 【免费下载链接】anno1800-mod-loader The one and only mod loader for Anno 1800, supports loading of unpacked RDA files, XML merging and Python mods. 项目地址: https://gitcode.com/gh_mirrors/an/an…...

MedGemma X-Ray开源大模型部署:医疗AI合规性与本地化实践

MedGemma X-Ray开源大模型部署&#xff1a;医疗AI合规性与本地化实践 1. 引言&#xff1a;当AI遇见医疗影像 想象一下&#xff0c;一位年轻的住院医师面对一张复杂的胸部X光片&#xff0c;需要快速判断是否存在肺炎、气胸或骨折的迹象。传统的阅片过程依赖经验积累&#xff0…...

Youtu-Parsing工业文档解析:设备说明书表格+示意图+技术参数提取

Youtu-Parsing工业文档解析&#xff1a;设备说明书表格示意图技术参数提取 1. 引言&#xff1a;当工业文档遇上智能解析 想象一下这个场景&#xff1a;你是一家设备制造公司的技术工程师&#xff0c;手头有一份50页的设备说明书PDF&#xff0c;里面密密麻麻全是技术参数表格、…...

丹青幻境GPU优化:Bfloat16混合精度下Z-Image推理速度提升47%

丹青幻境GPU优化&#xff1a;Bfloat16混合精度下Z-Image推理速度提升47% "见微知著&#xff0c;凝光成影。执笔入画&#xff0c;神游万象。" 丹青幻境 是一款基于 Z-Image 架构与 Cosplay LoRA 历练卷轴打造的数字艺术终端。它告别了冷硬的科技感&#xff0c;将 4090…...

DeepSeek-OCR-2惊艳效果展示:多栏/斜拍/模糊PDF精准识别对比图集

DeepSeek-OCR-2惊艳效果展示&#xff1a;多栏/斜拍/模糊PDF精准识别对比图集 1. 从机械扫描到智能理解&#xff1a;OCR技术的革命性突破 如果你曾经尝试过从PDF文档中提取文字&#xff0c;特别是那些排版复杂、图片模糊或者拍摄角度倾斜的文档&#xff0c;你一定会理解那种挫…...

5个步骤掌握B站推流码获取与OBS直播系统搭建:从入门到专业的完整指南

5个步骤掌握B站推流码获取与OBS直播系统搭建&#xff1a;从入门到专业的完整指南 【免费下载链接】bilibili_live_stream_code 用于在准备直播时获取第三方推流码&#xff0c;以便可以绕开哔哩哔哩直播姬&#xff0c;直接在如OBS等软件中进行直播&#xff0c;软件同时提供定义直…...

ComfyUI-VideoHelperSuite解决VHS_VideoCombine节点缺失的4阶段实战方案

ComfyUI-VideoHelperSuite解决VHS_VideoCombine节点缺失的4阶段实战方案 【免费下载链接】ComfyUI-VideoHelperSuite Nodes related to video workflows 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-VideoHelperSuite 在ComfyUI视频工作流中&#xff0c;VHS_V…...

ReadMe.md

一、先告诉你&#xff1a;这个项目是干嘛的&#xff1f; 这是一套网页自动化 E2E 测试框架用来自动打开浏览器 → 自动点页面 → 自动校验功能是否正常 二、最关键&#xff1a;你必须先做的 1 件事&#xff08;否则跑不起来&#xff09; 在项目根目录创建 .env 文件 项目根目录…...

大模型提升垃圾邮件识别精度

大模型在垃圾邮件识别与处理中的应用进展与技术优化 问题解构 核心任务识别&#xff1a;问题核心在于了解大模型&#xff08;Large Language Models, LLMs&#xff09;在“垃圾邮件识别”这一经典文本分类任务上的最新应用进展&#xff0c;可能包括准确率提升、新技术应用、处…...

如何用轻量工具实现Windows 11系统深度净化?

如何用轻量工具实现Windows 11系统深度净化&#xff1f; 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本&#xff0c;用于从Windows中移除预装的无用软件&#xff0c;禁用遥测&#xff0c;从Windows搜索中移除Bing&#xff0c;以及执行各种其他更改以简化和改善你的Wi…...