rust语言学习笔记(指针十)RwLock<T>(读写锁)

多个读取者同时访问数据,写入者独占访问

  • 读-读共享‌:当没有写入者时,任意数量的线程可以同时持有读锁。这意味着读取操作可以并行执行,无需排队。
  • 写-写互斥‌:同一时刻只能有一个线程持有写锁。
  • 读-写互斥‌:只要有写入者持有写锁,所有读取者必须等待;反之,只要有读取者持有读锁,写入者也必须等待所有读取者释放锁后才能获取写锁。
use std::sync::{Arc, RwLock};
use std::thread;

fn main() {
    let mut handles = Vec::new();                    // 存储线程任务的句柄
    let data = Arc::new(RwLock::new(vec![1, 2, 3]));

    for i in 0..10 {
        let datar = data.clone();
        handles.push(thread::spawn(move || {
            let d = datar.read().unwrap();
            println!("{}线程读到的数据:{:?}", i, d);
        }));
    }
    
    let dataw = data.clone();
    handles.push(thread::spawn(move || {
        let mut d = dataw.write().unwrap();
        d.push(4);
        println!("写入后的数据:{:?}", d);
    }));

    for handle in handles {
        handle.join().unwrap(); // 等待所有线程完成执行
    }
    
    println!("最后的数据:{:?}", data.read().unwrap());
}

10.1 RwLock Mutex 对比

  • Mutex 的局限‌:Mutex 是纯粹的互斥锁。即使多个线程只是想要‌读取‌数据,它们也必须排队,一次只有一个线程能进入临界区。这在读取频繁、写入稀少的场景下会造成不必要的串行化,降低性能。
  • RwLock 的优势‌:它细化了锁的粒度。在“读多写少”的场景中,大部分时间多个线程可以并行读取,只有在少数写入发生时才进行互斥同步。这大大减少了线程阻塞的时间,提高了系统的整体吞吐量。
特性Mutex<T>RwLock<T>
并发读取❌ 不支持(串行)✅ 支持(并行)
并发写入❌ 不支持(串行)❌ 不支持(串行)
实现复杂度
适用场景通用、写频繁、短临界区读多写少、长读取操作
主要风险性能瓶颈(读排队)写饥饿、锁升级死锁

最佳实践建议:
默认首选 Mutex<T>,因为它简单且安全。只有当你明确观察到读取操作成为性能瓶颈,且场景符合“读多写少”时,才考虑切换到 RwLock<T>。在使用 RwLock 时,务必注意避免锁升级,并监控是否存在写饥饿现象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值