Rust 并发编程实战课
晁岳攀(鸟窝)
前微博技术专家,知名微服务框架 rpcx 作者
596 人已学习
新⼈⾸单¥98
登录后,你可以任选4讲全文学习
课程目录
已更新 24 讲/共 38 讲
Rust 并发编程实战课
15
15
1.0x
00:00/00:00
登录|注册

21|一夫当关,万夫莫开:互斥锁

你好,我是鸟窝。
这一节课,我们重点学习传统并发编程最常用的一个并发数据结构:互斥锁
互斥锁(Mutex,全称 Mutual Exclusion Lock)是一种同步原语,用于保护共享资源,确保同一时刻只有一个线程(并发单元)可以访问该资源,其他线程必须等待锁释放后才能继续访问。
在多线程程序中,如果多个线程同时访问或修改同一份数据,可能会导致数据竞争(Data Race)和不一致(Inconsistent State)问题。互斥锁可以避免这些问题,保证:
同时只有一个线程访问关键数据。
其他线程必须等待当前持有锁的线程释放锁之后,才能获得访问权限。

互斥锁的基本用法

互斥锁(Mutex 是一种非常经典的并发原语,早在 C 和 C++ 中就已经广泛使用。
它的本质是:当一个线程访问临界区时,其他线程必须等待。也就是说,这个互斥锁会阻塞等待锁可用的线程。
下面是 Mutex 的一个简单例子:
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
// 创建一个共享的计数器,包裹在Arc和Mutex中
let counter = Arc::new(Mutex::new(0));
// 准备多个线程,每个线程对计数器加1
let mut handles = vec![];
for _ in 0..5 {
let counter = Arc::clone(&counter);
let handle = thread::spawn(move || {
let mut num = counter.lock().unwrap(); //获取锁
*num += 1;
println!("Thread incremented counter to: {}", *num);
});
handles.push(handle);
}
// 等待所有线程结束
for handle in handles {
handle.join().unwrap();
}
// 最终计数器的值
println!("Final counter value: {}", *counter.lock().unwrap());
}
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
  • 解释
  • 总结

1. 互斥锁(Mutex)是一种同步原语,用于保护共享资源,确保同一时刻只有一个线程可以访问该资源,其他线程必须等待锁释放后才能继续访问。 2. Rust中的Mutex = 互斥锁 + 数据保护 + 故障检测 + 自动恢复机制,远比传统语言的Mutex更“智能”,也更符合Rust“安全第一”的语言哲学。 3. 互斥锁的基本用法是在多线程程序中保护共享资源,避免数据竞争和不一致问题,通过lock方法获取锁,确保对数据的独占访问。 4. Mutex的try_lock方法尝试获取锁,如果无法获取则返回Err,不会阻塞,适用于需要非阻塞的情况。 5. Mutex的get_mut方法返回底层数据的可变引用,无需进行实际的锁定,可变借用静态地保证不存在锁。 6. Mutex的into_inner方法消费互斥锁,并返回底层数据,使得互斥锁本身不存在。 7. MutexGuard是互斥锁“作用域锁”的RAII实现,当被丢弃时,锁将被解锁。 8. 互斥锁的方法包括lock、try_lock、get_mut、into_inner等,提供了对底层数据的访问和操作。 9. 锁的开销包括获取和释放锁的性能开销,频繁的锁操作会降低程序性能,可以通过减少锁的粒度、使用更高效的同步机制和减少锁的竞争来减少锁的开销。 10. 互斥锁的核心作用是保护共享资源,确保在多线程环境下,同一时刻只有一个线程能够访问特定的数据,通过使用`std::sync::Mutex`,开发者可以有效地避免数据竞争和不一致性问题,这对于构建可靠的并发程序至关重要。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Rust 并发编程实战课》
新⼈⾸单¥98
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部
文章页面操作
MAC
windows
作用
esc
esc
退出沉浸式阅读
shift + f
f11
进入/退出沉浸式
command + ⬆️
home
滚动到页面顶部
command + ⬇️
end
滚动到页面底部
⬅️ (仅针对订阅)
⬅️ (仅针对订阅)
上一篇
➡️ (仅针对订阅)
➡️ (仅针对订阅)
下一篇
command + j
page up
向下滚动一屏
command + k
page down
向上滚动一屏
p
p
音频播放/暂停
j
j
向下滚动一点
k
k
向上滚动一点
空格
空格
向下滚动一屏
播放器操作
MAC
windows
作用
esc
esc
退出全屏
⬅️
⬅️
快退
➡️
➡️
快进
空格
空格
视频播放/暂停(视频全屏时生效)