RwLock<T>
- Rust kursu
- İleri seviye
- Ders 15/81
- 4 dk
RwLock<T> ile çok okuyucu tek yazıcı kilidi kullanırsın.
RwLock<T>
RwLock<T>, ödünç alma kurallarının thread'ler arası sürümüdür: aynı anda çok okuyucu (read()) ya da tek yazıcı (write()). Okumanın yazmadan çok daha sık olduğu veriler (ayarlar, önbellekler) için Mutex'ten daha verimlidir:
use std::sync::{Arc, RwLock};
let kayit = Arc::new(RwLock::new(Vec::new()));
kayit.write().unwrap().push(String::from("açılış"));
let adet = kayit.read().unwrap().len();Okuyucular birbirini engellemez; bir yazıcı ise tüm okuyucuların bitmesini bekler.
Okuyucu thread'ler
Her okuyucu kendi Arc kopyasıyla okur; okuma guard'ı thread içinde kısa süre tutulur:
let tutucular: Vec<_> = (0..3)
.map(|_| {
let k = Arc::clone(&kayit);
thread::spawn(move || k.read().unwrap().len())
})
.collect();
let uzunluklar: Vec<usize> = tutucular.into_iter().map(|h| h.join().unwrap()).collect();Uygulama Çok okuyucu
Arc<RwLock<Vec<String>>> oluştur ve write ile iki kayıt ekle. Üç okuyucu thread başlat; her biri read ile uzunluğu döndürsün. Sonuçları sırayla toplayıp yazdır.
Başlangıç kodu
use std::sync::{Arc, RwLock};
use std::thread;
fn main() {
// buraya yaz
}Örnek çözüm
use std::sync::{Arc, RwLock};
use std::thread;
fn main() {
let kayit = Arc::new(RwLock::new(Vec::new()));
kayit.write().unwrap().push(String::from("açılış"));
kayit.write().unwrap().push(String::from("giriş"));
let tutucular: Vec<_> = (0..3)
.map(|_| {
let k = Arc::clone(&kayit);
thread::spawn(move || k.read().unwrap().len())
})
.collect();
let uzunluklar: Vec<usize> = tutucular.into_iter().map(|h| h.join().unwrap()).collect();
println!("{:?}", uzunluklar);
}Beklenen çıktı
[2, 2, 2]
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Yazma neredeyse okuma kadar sıksa hangisi genellikle daha iyidir?
- Cell
- Mutex; RwLock'un ek yönetim maliyeti kazancı yok eder Doğru cevap
- RwLock her zaman
- İkisi de kullanılamaz
Açıklama: RwLock okuyucu sayısını tutmak zorundadır; okuma baskın değilse basit Mutex daha hızlıdır. Ölçmeden karar verme.
2 Yazma kilidi
kayit.____().unwrap().push(String::from("açılış"));
kayit.write().unwrap().push(String::from("açılış"));
Açıklama: RwLock::write dışlayıcı yazma erişimi verir.
3 Yöntem ve erişim
| Kavram | Anlamı |
|---|---|
read() |
Paylaşılan okuma |
write() |
Dışlayıcı yazma |
Mutex::lock() |
Her erişim dışlayıcı |
try_read() |
Beklemeden dene |