Rust每週一知 Rust中的讀寫鎖RwLock

2021-10-24 00:18:32 字數 1922 閱讀 5052

本文簡單介紹 rust 中的讀寫鎖rwlock,內容概覽如下:

基本概念

rust中的rwlock實現

在電腦科學中,有一些經典的同步問題,讀者-作家問題就是其中乙個,該問題涉及多個併發執行緒試圖同時訪問同一共享資源的情況。

讀者-作家問題:我們擁有一種資源(例如,資料庫),可以由不修改資源的讀者和可以修改資源的作家訪問。當作家修改資源時,其他任何人(讀者或作家)都無法同時訪問它,因為另一位作家可能破壞資源,而另一位讀者可能讀取部分修改的值,因此可能出現不一致。

為了準確理解問題,我們先介紹一些基本概念。

臨界區 critical p,在併發程式設計中,對共享資源的併發訪問可能導致意外或錯誤的行為,因此需要以某種方式保護訪問共享資源的那部分程式。這部分受保護的**片段稱為臨界區。

互斥量 mutex,在多執行緒併發程式設計時,為了確保一次僅乙個執行緒可以訪問共享資源,引入了mutex的概念,它是 mutual exclusion 的縮寫,通常翻譯為互斥量或互斥鎖。

訊號量 semaphore,同樣的,為了控制併發系統中多個執行緒對共享資源的訪問,引入了semaphore的概念,通常翻譯為訊號量。

讀寫鎖 rwlock,在電腦科學中,讀寫鎖是解決讀者-作家問題的同步原語之一。讀寫鎖允許讀操作共享訪問,而寫操作則需要互斥訪問。通常構造在互斥量和條件變數之上,或者構造在訊號量之上。

自讀者-作家問題提出以來,人們對它進行了廣泛的研究,讀寫鎖是解決讀者-作家問題的方案之一,按照讀寫鎖的鎖定優先順序策略分為以下三種:

標準庫中的rwlock

同時,第三方庫parking_lot中也實現了rwlock,它與標準庫的rwlock的主要區別是:

基本的使用,示例如下:

#[macro_use]

extern crate lazy_static;

use std::thread;

use std::sync::rwlock;

//use parking_lot::rwlock;

lazy_static!

fn main()

});let thread2 = thread::spawn(||

});thread1.join().unwrap();

thread2.join().unwrap();

let r = inc.read().unwrap();

//let r = inc.read();

println!("{}", *r); // 輸出 18

}

一般專案中會有對全域性配置檔案的操作,示例如下:

#[macro_use]

extern crate lazy_static;

use std::sync::rwlock;

#[derive(debug, clone, copy)]

pub struct myconfig

lazy_static! );

}impl myconfig ,

_ => (),

};ok(())

}pub fn global_config() -> myconfig

}fn main()

輸出:

[src/main.rs:39] a = myconfig 

[src/main.rs:45] a = myconfig

rust非同步入門 

理解智慧型指標 

如何理解rust中的變與不變 

Rust每週一知 一種 Rust 設計模式

最近發現一種 rust 的設計模式,有點好玩,發出來大家 一下。示例如下 use std ops deref trait traitfoo struct a impl traitfoo for a struct b implb implderef for b trait traitbar struc...

Rust每週一庫 hyper 底層http庫

現在說到寫應用,網路框架肯定是必不可少的。今天就給大家簡單介紹一下hyper。hyper是乙個偏底層的http庫,支援http 1和http 2,支援非同步rust,並且同時提供了服務端和客戶端的api支援。很多同學可能覺得既然hyper是個偏底層的框架,那是不是就不需要去了解了呢?首先很多上層的框...

Rust每週一庫 csv 檔案讀寫庫

這次搬運的庫是很多資料分析師 資料科學家 以及金融分析師常用的csv檔案庫。用rust實現的乙個高效能 靈活的csv讀寫器,支援serde.將以下配置加進你的cargo.toml dependencies csv 1.1 簡單示範如何從stdin讀取csv資料並通過stdout將每一條記錄列印出來。...