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

前言

这节介绍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());
}
相关推荐
现任明教教主~42 分钟前
SpringBoot+Vue学生宿舍管理系统源码 带部署文档
vue.js·spring boot·后端
码事漫谈7 小时前
骂AI,会让它做得更好吗?
后端
“AI国潮设计-小江”7 小时前
《Python+SDXL实战:用ControlNet精准控制“英歌舞翻糖吐司”构图,附批量生成脚本》
开发语言·人工智能·python·prompt·aigc
程序喵大人8 小时前
【C++入门】编译链接模型 - 01 一个 C++ 程序是怎样变成可执行文件的
开发语言·c++·编译链接模型
陈随易8 小时前
bm2,Node.js 与 Bun 项目部署新选择
前端·后端·程序员
架构技术专栏9 小时前
AI Agent 框架怎么选:从一次制度查询拆出技术边界
后端·面试
sunshine22 girl9 小时前
Java学习七 Java 项目实战1-项目创建和主页面搭建
java·开发语言·学习
菜鸟~noob23310 小时前
【电子战】第三季预告—波武器与电子系统强力毁伤
开发语言·数据库·matlab·电子战
惊讶的猫11 小时前
工具选对之后还不够:商城 Agent 的参数与权限治理
开发语言·python
cmpxr_11 小时前
【MicroPython】如何刷新ESP8266的固件
开发语言·micropython