CodeBlanks Logo Icon CodeBlanks

RwLock<T>

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

main.rs
use std::sync::{Arc, RwLock};
use std::thread;

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
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

Soru
kayit.____().unwrap().push(String::from("açılış"));
Cevap
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

İleri seviye bölümündeki tüm dersler