Rust standart kütüphanesi, çok iş parçacıklı çalışmada güvenli bir şekilde çalışmak için temel senkronizasyon primitiflerini sunar:
AtomicBool, AtomicUsize vb.) — kilit olmadan okuma/yazma işlemleri, donanım seviyesinde;Örnek:
use std::sync::{Arc, Mutex}; use std::thread; fn main() { let counter = Arc::new(Mutex::new(0)); let mut handles = vec![]; for _ in 0..10 { let counter = Arc::clone(&counter); let handle = thread::spawn(move || { let mut num = counter.lock().unwrap(); *num += 1; }); handles.push(handle); } for handle in handles { handle.join().unwrap(); } println!("Sonuç: {}", *counter.lock().unwrap()); }
Soru: Rust, Mutex<T> kullanmanın, derleme aşamasında yapılan kontrol sayesinde deadlock'ları tamamen ortadan kaldırdığını garanti eder mi?
Cevap: Hayır. Rust, sahiplik ve borrow-checker aracılığıyla verilere güvenli erişim sağlar, ancak dil düzeyinde deadlock'lara karşı koruma sağlamaz. Deadlock'lar, birkaç Mutex'in ele geçirilme sırasının ihlal edilmesi veya bunların özyinelemeli ele geçirilmesi gibi mantıksal nedenlerle ortaya çıkar. Örnek:
use std::sync::Mutex; let lock1 = Mutex::new(0); let lock2 = Mutex::new(0); // İş Parçacığı 1: lock1 -> lock2, İş Parçacığı 2: lock2 -> lock1 ⇒ deadlock
Tarih
Tarih
Mutex<Option<T>>'dan RwLock<T>'a büyük çapta geçiş yapıldı ama yazılabilir kilidin okuma kilidinden daha uzun olabileceği dikkate alınmadı. Pik yük altında, yazma için bekleme kuyrukları nedeniyle işleme gecikmeleri onlarca saniye sürdü.Tarih
Programcılar, iş parçacıklarında tasarruf etmeye çalıştı, yüzlerce iş parçacığına Arc<Mutex<_>> "itip" gönderdiler. Planlayıcının çalışması ve mutex'in yeniden kullanımı üzerindeki ince noktalardan dolayı şaşırtıcı karşıt beklentiler ortaya çıktı — verimlilik 5 kat azaldı!