Rc 与 Arc 引用计数
Rc<T> 单线程共享、Arc<T> 多线程共享、strong_count/weak_count
Rc 与 Arc 引用计数
Rc<T> 单线程共享所有权,Arc<T> 多线程安全——原子引用计数。
学完本章你将: 掌握 Rc 单线程共享、Arc 多线程、strong_count。
Rc —— 单线程共享
rust
use std::rc::Rc;
fn main() {
let a = Rc::new(String::from("共享数据"));
let b = Rc::clone(&a); // 引用计数 +1(浅拷贝——只复制指针)
let c = Rc::clone(&a); // +1
println!("引用计数: {}", Rc::strong_count(&a)); // 3
println!("{} {} {}", a, b, c);
} // 三个 Rc 都离开作用域后 String 被释放
Arc —— 多线程引用计数
rust
use std::sync::Arc;
use std::thread;
fn main() {
let data = Arc::new(vec![1, 2, 3]);
let mut handles = vec![];
for _ in 0..3 {
let data = Arc::clone(&data);
handles.push(thread::spawn(move || {
println!("{:?}", data);
}));
}
for h in handles {
h.join().unwrap();
}
}
Rc vs Arc
rust
// Rc —— 非线程安全,更快(非原子操作)
// Arc —— 线程安全,略慢(原子操作)
// Rc::strong_count —— 强引用计数
// Rc::weak_count —— 弱引用(用于打破循环引用)