- 使用
Mutex
和Arc
模拟线程安全的Cell
:
- 在Rust中,
Cell
类型本身不是线程安全的。为了在多线程环境下实现类似Cell
的内部可变性且保证线程安全,可以使用Mutex
(互斥锁)来保护数据,用Arc
(原子引用计数)来实现数据的共享。
Mutex
提供了互斥访问的机制,同一时间只有一个线程可以获取锁并访问被保护的数据。Arc
则用于在多个线程间安全地共享数据,因为它的引用计数操作是原子的。
- 代码示例:
use std::sync::{Arc, Mutex};
fn main() {
let shared_data = Arc::new(Mutex::new(10));
let cloned_data = shared_data.clone();
std::thread::spawn(move || {
let mut data = cloned_data.lock().unwrap();
*data += 1;
println!("Thread incremented data to: {}", *data);
}).join().unwrap();
let data = shared_data.lock().unwrap();
println!("Main thread sees data as: {}", *data);
}
- 代码说明:
- 首先,创建了一个
Arc
包裹的Mutex
,其中Mutex
内部包裹着一个i32
类型的数据10
。
- 接着,通过
clone
方法创建了Arc
的另一个副本cloned_data
,以便在新线程中使用。
- 在新线程中,通过
lock
方法获取Mutex
的锁,unwrap
用于处理获取锁失败的情况(这里假设不会失败)。获取锁后,可以修改内部数据。
- 主线程中同样获取锁并打印数据,由于
Mutex
的互斥机制,新线程对数据的修改对主线程可见,从而实现了线程安全的内部可变性,类似Cell
的功能(虽然Cell
是无锁的且用于单线程)。