當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Rust RwLock用法及代碼示例


本文簡要介紹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-lang.org大神的英文原創作品 Struct std::sync::RwLock。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。