RwLock 读写锁
学习目标
- 理解读写锁的场景
- 掌握
RwLock<T>使用 - 理解与 Mutex 的区别
核心概念
基本用法
use std::sync::RwLock;
fn main() {
let lock = RwLock::new(5);
// 多个读取可以并发
{
let r1 = lock.read().unwrap();
let r2 = lock.read().unwrap();
println!("r1={}, r2={}", r1, r2);
}
// 写入是排他的
{
let mut w = lock.write().unwrap();
*w = 6;
}
println!("value: {}", *lock.read().unwrap());
}
多线程读写
use std::sync::{Arc, RwLock};
use std::thread;
fn main() {
let data = Arc::new(RwLock::new(vec![1, 2, 3]));
let mut handles = vec![];
// 多个读者
for i in 0..3 {
let data = Arc::clone(&data);
handles.push(thread::spawn(move || {
let r = data.read().unwrap();
println!("读者 {}: {:?}", i, *r);
}));
}
// 一个写者
let data_clone = Arc::clone(&data);
handles.push(thread::spawn(move || {
let mut w = data_clone.write().unwrap();
w.push(4);
println!("写者完成: {:?}", *w);
}));
for h in handles { h.join().unwrap(); }
}
Mutex vs RwLock
| 类型 | 读 | 写 | 场景 |
|---|---|---|---|
Mutex | 排他 | 排他 | 读写均衡 |
RwLock | 并发 | 排他 | 读多写少 |
小结
| 操作 | 语法 |
|---|---|
| 读锁 | rwlock.read() |
| 写锁 | rwlock.write() |
| 多线程共享 | Arc<RwLock<T>> |
练习编辑器
rust
Loading...