使用Mutex
和Arc
保证线程安全的代码示例
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
// 使用Arc来共享数据,Mutex来保护数据的可变性
let shared_data = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..10 {
let data = Arc::clone(&shared_data);
let handle = thread::spawn(move || {
let mut num = data.lock().unwrap();
*num += 1;
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
println!("Final value: {}", *shared_data.lock().unwrap());
}
Arc
和Rc
在多线程场景下的区别体现
- 线程安全性
Rc
(Reference Counting
)是单线程引用计数类型,它没有实现Send
和Sync
这两个trait
。这意味着Rc
不能在线程间安全地传递,因为它的引用计数操作不是原子的,在多线程环境下可能导致数据竞争。
Arc
(Atomic Reference Counting
)是原子引用计数类型,实现了Send
和Sync
这两个trait
。这使得Arc
可以安全地在线程间传递,其引用计数操作是原子的,保证了多线程环境下的安全性。
- 适用场景
Rc
适用于单线程环境中,当你需要在多个所有者之间共享不可变数据,并且希望在所有所有者都丢弃数据时自动释放内存的场景。
Arc
适用于多线程环境中,当你需要在多个线程之间共享数据时,Arc
可以保证引用计数操作的原子性,避免数据竞争,确保线程安全。