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

没有synchronized,rust怎么防并发?

学过Java的同学对synchronized肯定不陌生,那么rust里怎么办呢?

在Rust中,可以使用标准库提供的 std::sync::Mutex 来实现加锁功能。Mutex是互斥锁的一种实现,用于保护共享数据在并发访问时的安全性。
下面是一个简单的示例代码,展示了如何在Rust中使用Mutex进行加锁:

use std::sync::Mutex;
use std::thread;fn main() {// 创建一个共享数据let counter = Mutex::new(0);// 创建多个线程,每个线程对共享数据进行加锁和修改let mut handles = vec![];for _ in 0..10 {let handle = thread::spawn(move || {// 对共享数据加锁let mut data = counter.lock().unwrap();// 修改共享数据*data += 1;});handles.push(handle);}// 等待所有线程完成for handle in handles {handle.join().unwrap();}// 输出最终结果println!("Final value: {}", *counter.lock().unwrap());
}

在上述代码中,我们首先创建了一个共享数据 counter ,它被Mutex包裹起来。然后,我们创建了多个线程,并在每个线程中对共享数据进行加锁、修改和解锁操作。
在加锁时,我们使用 counter.lock().unwrap() 来获取Mutex的锁。这将会阻塞当前线程,直到锁可用。一旦获取到锁,我们就可以安全地修改共享数据。
在解锁时,Mutex会自动释放锁,允许其他线程获取锁并访问共享数据。
最后,我们输出最终结果。由于Mutex保证了对共享数据的安全访问,所以最终结果应该是正确的。
需要注意的是,在使用Mutex时,需要注意避免死锁和竞争条件。死锁可能发生在多个线程相互等待对方释放锁的情况下。竞争条件可能发生在多个线程同时修改共享数据时。

最后的最后留个作业,下面代码有问题吗? 评论区讨论

use std::sync::Mutex;
use std::thread;fn main() {// 创建两个共享数据let data1 = Mutex::new(0);let data2 = Mutex::new(0);let handle1 = thread::spawn(move || {// 对data1加锁let _lock1 = data1.lock().unwrap();println!("Thread 1 acquired lock on data1");// 睡眠一段时间,模拟处理过程thread::sleep_ms(1000);let _lock2 = data2.lock().unwrap();println!("Thread 1 acquired lock on data2");});let handle2 = thread::spawn(move || {// 对data2加锁let _lock2 = data2.lock().unwrap();println!("Thread 2 acquired lock on data2");// 睡眠一段时间,模拟处理过程thread::sleep_ms(1000);let _lock1 = data1.lock().unwrap();println!("Thread 2 acquired lock on data1");});handle1.join().unwrap();handle2.join().unwrap();
}
http://www.lryc.cn/news/115513.html

相关文章:

  • 1.Python简介及安装(3.11.4)
  • face_recognition人脸识别与人脸检测
  • vue3获得url上的参数值
  • chapter15:springboot与监控管理
  • http历史版本
  • 【Go语言】Golang保姆级入门教程 Go初学者chapter2
  • 关于ETL的两种架构(ETL架构和ELT架构) qt
  • 【Linux】进程间通信——管道
  • Element-plus中tooltip 提示框修改宽度——解决方案
  • java实现当前系统时间格式化
  • 篇十一:享元模式:共享细粒度对象
  • Dev控件 Gridcontrol,gridview 实现多选功能
  • 内网穿透:如何通过公网访问本地Web服务器?
  • 在qemu中挂载镜像文件
  • 报错注入(主键重复)攻击原理
  • Golang基础教程
  • ppt压缩文件怎么压缩最小?文件压缩技巧分享
  • 实例033 制作闪烁的窗体
  • 【JavaEE进阶】Spring创建与使用
  • PHP8的循环控制语句-PHP8知识详解
  • 第八次作业
  • LeetCode //C - 290. Word Pattern
  • [保研/考研机试] 括号匹配问题 C++实现
  • springBoot集成caffeine,自定义缓存配置 CacheManager
  • 【瑞吉外卖】Git部分学习
  • 如何阐述自己做了一个什么样的东西
  • TC3XX - MCAL知识点(二十二):QSPI 同步与异步 Mcal配置及代码实战
  • led台灯哪些牌子性价比高?推荐几款性价比高的护眼台灯
  • 什么情况下容易发生锁表及如何处理
  • elk开启组件监控