use std::cell::RefCell;
use std::thread;
use std::sync::{Arc, Mutex};
struct SharedData {
data: RefCell<i32>
}
fn main() {
let shared = Arc::new(Mutex::new(SharedData { data: RefCell::new(0) }));
let handle = thread::spawn(move || {
let inner_shared = shared.lock().unwrap();
let mut data_ref = inner_shared.data.borrow_mut();
*data_ref += 1;
});
handle.join().unwrap();
}
- 为什么这样能正常工作:
- 生命周期与借用规则:
Arc
是引用计数智能指针,用于在多个线程间共享数据。它允许数据有多个所有者,但是这里使用 Mutex
来保证同一时间只有一个线程能访问内部数据。
Mutex
提供了互斥访问机制,通过 lock
方法获取锁,从而保证在同一时间只有一个线程能获取到 SharedData
的可变引用。
RefCell
是在单线程环境下实现内部可变性的类型,这里通过 borrow_mut
方法获取可变引用。因为 Mutex
保证了同一时间只有一个线程能访问 SharedData
,所以不会违反 RefCell
的借用规则。
- 线程安全:
Arc<Mutex<SharedData>>
这种组合确保了数据在线程间的安全共享。Mutex
确保同一时间只有一个线程可以访问 SharedData
,从而避免了数据竞争,保证了线程安全。