When to use Mutex and when to use RwLock in Rust for multithreading?
Hello, colleagues! I'm learning Rust and multithreading, and I came across two synchronization primitives: `Mutex` and `RwLock`. They both seem to protect data from race conditions, but I don't quite understand when to choose which one.
I have a project where multiple threads read and sometimes write data to a shared cache (HashMap). I wrote a simple example with `Mutex`, but I feel it's not optimal because reading blocks other reads:
```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