Z
ZHANK
编程在线教程Rust 教程Rc 与 Arc 引用计数
智能指针

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    —— 弱引用(用于打破循环引用)