Rust 的 RefCell 并不是為多線程設計的。它是一個基于內部可變性(interior mutability)的模式,允許你在不可變引用的情況下修改數據。然而,RefCell 并不是線程安全的,因此在多線程環境中使用它可能會導致數據競爭(data race)和其他未定義行為。
在多線程環境中,你應該使用線程安全的可變引用類型,如 Arc<Mutex
這是一個使用 Arc<Mutex
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
let counter = Arc::new(Mutex::new(0));
let mut handlers = vec![];
for _ in 0..10 {
let counter = Arc::clone(&counter);
let handler = thread::spawn(move || {
let mut num = counter.lock().unwrap();
*num += 1;
});
handlers.push(handler);
}
for handler in handlers {
handler.join().unwrap();
}
println!("Result: {}", *counter.lock().unwrap());
}
在這個例子中,我們使用 Arc 來共享計數器,并使用 Mutex 來確保在同一時間只有一個線程可以修改它。這樣,我們就可以在多線程環境中安全地共享和修改數據。