متى تستخدم Mutex ومتى تستخدم RwLock في Rust لتعدد الخيوط؟
مرحباً زملائي! أنا أدرس Rust وتعدد الخيوط، وقد صادفت بدائيين للمزامنة: `Mutex` و `RwLock`. يبدو أن كلاهما يحمي البيانات من سباقات البيانات، لكنني لا أفهم تماماً متى أختار أياً منهما.
لدي مشروع حيث تقوم عدة خيوط بقراءة وأحياناً كتابة البيانات في cache مشترك (HashMap). لقد كتبت مثالاً بسيطاً باستخدام `Mutex`، لكنني أشعر أن هذا ليس مثالياً لأن القراءة تمنع القراءات الأخرى:
```rust
use std::sync::{Arc, Mutex};
use std::thread;
use std::collections::HashMap;
fn main() {
let cache = Arc::new(Mutex::new(HashMap::new()));
let mut handles = vec![];
for i in 0..10 {
let cache = Arc::clone(&cache);
handles.push(thread::spawn(move || {
let mut data = cache.lock().unwrap();
data.insert(i, for
```