【第十二课】Rust并发编程(三)

news/2024/12/5 17:12:31/

前言

这节介绍Rust并发编程之共享可变状态。共享可变状态指的是多个线程访问同一块内存上的数据,要想达到这样的效果,我们必须要了解互斥器,或者说锁,在某个时刻互斥器只允许一个线程访问。,也就意味着每次访问都需要获取锁和释放锁2个操作。

互斥器

互斥器,Mutex,一次只允许一个线程访问数据,在获取数据前,需要申请锁,操作完数据后,需要释放锁。参考官方文档的例子,想象在一个会议室中,只有一个麦克风,任何人想要发言,都要把麦克风拿在手上,发言结束后也要把麦克风归还,下一个人才能拿到麦克风发言。

下面是一个互斥器的入门demo,使用Mutex::new新建了一个互斥器保护的值,使用lock方法去获取锁。lock方法返回的其实是一个LockResult,因为可能会获取锁失败,使用unwarp解析出值,num是一个MutexGuard指针,我们要想访问到其中的值需要使用*来解指针,做加一操作,这里在代码中没有体现出释放锁的代码,这是因为当num走出作用域之后,锁自动释放了。

rust">use std::sync::Mutex;fn main() {let m = Mutex::new(1);{let mut num = m.lock().unwrap();*num = *num + 1;}println!("m = {:?}", m);
}

多线程

在上面的基础上,我们实现一个多线程累加一个值的例子。

我们进一步的将互斥器包装为Arc智能指针,这是为了方便在多线程之间传递。

随后创建了10个新线程,每个线程持有互斥器的所有权,在闭包中,通过获取锁的方式操作我们需要累加的值,最后打印出counter的结果应该是10.

rust">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 counterArc = Arc::clone(&counter);handles.push(thread::spawn(move || {let mut num = counterArc.lock().unwrap();*num = *num + 1;}));}for handle in handles {handle.join().unwrap();}println!("counter = {}", counter.lock().unwrap());
}


http://www.ppmy.cn/news/1551330.html

相关文章

【C++】IO库(三):string流

8.3 string 流 sstream 头文件定义了三个类型来支持内存 IO,这些类型可以向 string 写入数据,也可以从 string 读取数据,就像 string 是一个 IO 流一样。 istringstream 从 string 读数据;ostringstream 向 string 写入数据&…

【MATLAB源码-第226期】基于matlab的64QAM系统相位偏移估计HOS算法仿真,对比补偿前后的星座图误码率。

操作环境: MATLAB 2022a 1、算法描述 高阶统计量(HOS)频偏估计算法 高阶统计量(Higher Order Statistics, HOS)频偏估计算法是一种先进的信号处理技术,广泛应用于现代数字通信系统中,以应对和…

【小白学机器学习41】如何从正态分布的总体中去抽样? 获得指定正态分布的样本的2种方法

目录 1 目标:使用2种方法,去从正态分布的总体中去抽样,获得样本 1.1 step1: 首先,逻辑上需要先有符合正态分布的总体population 1.2 从总体中取得样本,模拟抽样的过程 2 从正态分布抽样的方法1 3 从正态分布抽样…

mac maven编译出现问题

背景 进行maven install 命令,报错: [ERROR] COMPILATION ERROR : [INFO] ------------------------------------------------------------- [ERROR] No compiler is provided in this environment. Perhaps you are running on a JRE rather than a J…

C#中面试的常见问题008

1.内存泄露 内存泄露的原因: 未释放动态分配的内存:在使用malloc、new等动态内存分配函数后,未能正确释放内存。引用计数错误:在引用计数管理内存的语言中,增加引用计数但未相应减少,导致内存无法释放。循…

格网法计算平面点云面积(matlab版本)

1、原理介绍 格网法计算平面点云面积,其思想类似高中油膜法计算面积。其将点云投影到水平面,再将点云划分成尺寸相同的格网。最后,统计格网内包含点的数量number,那么可利用如下公式计算得到点云的面积: Aeranumber*L…

SpringBoot 项目中使用 spring-boot-starter-amqp 依赖实现 RabbitMQ

文章目录 前言1、application.yml2、RabbitMqConfig3、MqMessage4、MqMessageItem5、DirectMode6、StateConsumer:消费者7、InfoConsumer:消费者 前言 本文是工作之余的随手记,记录在工作期间使用 RabbitMQ 的笔记。 1、application.yml 使…

容器第二天(day039)

1.jq处理json格式数据 使用场景:docker inspect出来的结果是json格式数据 安装:yum install -y jq 用法:docker inspect nginx:alpine |jq .[].GraphDriver.Data.WorkDir 遇到[],则.[]。 2.容器管理 运行起来的镜像可以成为容…