何时在 Rust 的多线程中使用 Mutex 以及何时使用 RwLock?
大家好!我正在学习 Rust 和多线程,遇到了两个同步原语:`Mutex` 和 `RwLock`。它们似乎都能保护数据免受竞态条件的影响,但我不太清楚何时该选择哪一个。
我有一个项目,其中多个线程读取并偶尔写入一个共享缓存(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, format!("value_{}", i));
// 读取也需要锁定
let val = data.get(&i).cloned();
println!("Thread {} got {:?}", i, val);
}));
}
for