本文簡單介紹 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將每一條記錄列印出來。...