本文简要介绍rust语言中 Struct std::sync::RwLock
的用法。
用法
pub struct RwLock<T: ?Sized> { /* fields omitted */ }
reader-writer 锁
这种类型的锁在任何时间点允许多个读取器或最多一个写入器。此锁的写入部分通常允许修改底层数据(独占访问),而此锁的读取部分通常允许只读访问(共享访问)。
相比之下, Mutex
不区分获取锁的读取器或写入器,因此阻塞任何等待锁可用的线程。只要写入者不持有锁,RwLock
将允许任意数量的读取者获取锁。
锁的优先级策略取决于底层操作系统的实现,这种类型不保证会使用任何特定的策略。特别是,等待获取 write
中的锁的写入器可能会或可能不会阻止对 read
的并发调用,例如:
// Thread 1 | // Thread 2
let _rg = lock.read(); |
| // will block
| let _wg = lock.write();
// may deadlock |
let _rg = lock.read(); |
类型参数T
表示该锁保护的数据。要求T
满足 Send
跨线程共享和 Sync
允许读者并发访问。从锁定方法返回的 RAII 守卫实现 Deref
(以及write
方法的 DerefMut
)以允许访问锁的内容。
中毒
RwLock
,如 Mutex
,会因Panics而中毒。但是请注意,RwLock
只有在被独占锁定(写入模式)时发生Panics时才会中毒。如果任何读者发生Panics,那么锁就不会中毒。
例子
use std::sync::RwLock;
let lock = RwLock::new(5);
// many reader locks can be held at once
{
let r1 = lock.read().unwrap();
let r2 = lock.read().unwrap();
assert_eq!(*r1, 5);
assert_eq!(*r2, 5);
} // read locks are dropped at this point
// only one write lock may be held, however
{
let mut w = lock.write().unwrap();
*w += 1;
assert_eq!(*w, 6);
} // write lock is dropped here
相关用法
- Rust RwLock.try_write用法及代码示例
- Rust RwLock.into_inner用法及代码示例
- Rust RwLock.read用法及代码示例
- Rust RwLock.try_read用法及代码示例
- Rust RwLock.new用法及代码示例
- Rust RwLock.write用法及代码示例
- Rust RwLock.is_poisoned用法及代码示例
- Rust RwLock.get_mut用法及代码示例
- Rust Result.unwrap_or_else用法及代码示例
- Rust RefCell.try_borrow_unguarded用法及代码示例
- Rust Ref.map用法及代码示例
- Rust RefMut.leak用法及代码示例
- Rust Ref.filter_map用法及代码示例
- Rust RefCell.replace_with用法及代码示例
- Rust Receiver.recv用法及代码示例
- Rust Range.is_empty用法及代码示例
- Rust Result.as_deref_mut用法及代码示例
- Rust Result.unwrap_or_default用法及代码示例
- Rust Rc.increment_strong_count用法及代码示例
- Rust Result.as_mut用法及代码示例
- Rust Result.map_or用法及代码示例
- Rust Result.err用法及代码示例
- Rust RangeTo用法及代码示例
- Rust Receiver.recv_timeout用法及代码示例
- Rust RangeInclusive.start用法及代码示例
注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Struct std::sync::RwLock。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。