本文簡要介紹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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。