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

发布时间:2026/7/2 11:03:30

rust语言学习笔记(指针十)RwLock<T>(读写锁) 多个读取者同时访问数据写入者独占访问‌读-读共享‌当没有写入者时任意数量的线程可以同时持有读锁。这意味着读取操作可以并行执行无需排队。‌写-写互斥‌同一时刻只能有一个线程持有写锁。‌读-写互斥‌只要有写入者持有写锁所有读取者必须等待反之只要有读取者持有读锁写入者也必须等待所有读取者释放锁后才能获取写锁。usestd::sync::{Arc,RwLock};usestd::thread;fnmain(){letmuthandlesVec::new();// 存储线程任务的句柄letdataArc::new(RwLock::new(vec![1,2,3]));foriin0..10{letdatardata.clone();handles.push(thread::spawn(move||{letddatar.read().unwrap();println!({}线程读到的数据{:?},i,d);}));}letdatawdata.clone();handles.push(thread::spawn(move||{letmutddataw.write().unwrap();d.push(4);println!(写入后的数据{:?},d);}));forhandleinhandles{handle.join().unwrap();// 等待所有线程完成执行}println!(最后的数据{:?},data.read().unwrap());}10.1RwLock与Mutex对比‌Mutex 的局限‌Mutex是纯粹的互斥锁。即使多个线程只是想要‌读取‌数据它们也必须排队一次只有一个线程能进入临界区。这在读取频繁、写入稀少的场景下会造成不必要的串行化降低性能。‌RwLock 的优势‌它细化了锁的粒度。在“读多写少”的场景中大部分时间多个线程可以并行读取只有在少数写入发生时才进行互斥同步。这大大减少了线程阻塞的时间提高了系统的整体吞吐量。特性MutexTRwLockT‌并发读取‌❌ 不支持串行✅ 支持并行‌并发写入‌❌ 不支持串行❌ 不支持串行‌实现复杂度‌低高‌适用场景‌通用、写频繁、短临界区读多写少、长读取操作‌主要风险‌性能瓶颈读排队写饥饿、锁升级死锁‌最佳实践建议默认首选MutexT因为它简单且安全。只有当你明确观察到读取操作成为性能瓶颈且场景符合“读多写少”时才考虑切换到RwLockT。在使用RwLock时务必注意避免锁升级并监控是否存在写饥饿现象。

相关新闻