04-Rc and Arc

Rc and Arc — Rust By Practice

内容来源 · Rust By Practice / Rust 语言实战

原文链接: https://practice-rust.beatai.org/smart-pointers/rc-arc.html

Rc and Arc

Rc<T> 用于单线程下的引用计数;Arc<T> 是线程安全的原子引用计数,常用于多线程共享数据。

  1. 🌟
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// 让代码工作
use std::rc::Rc;

fn main() {
    let a = Rc::new(5);
    let b = Rc::clone(&a);
    assert_eq!(Rc::strong_count(&a), 2);
    assert_eq!(*a + *b, 10);
    println!("Success!");
}
  1. 🌟
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
// 让代码工作
use std::rc::Rc;

#[derive(Debug)]
enum List {
    Cons(i32, Rc<List>),
    Nil,
}

use List::{Cons, Nil};

fn main() {
    let a = Rc::new(Cons(5, Rc::new(Cons(10, Rc::new(Nil)))));
    let b = Cons(3, Rc::clone(&a));
    println!("a count = {}", Rc::strong_count(&a));
    println!("Success!");
}
  1. 🌟🌟
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 让代码工作
use std::sync::Arc;
use std::thread;

fn main() {
    let counter = Arc::new(0);
    let mut handles = vec![];

    for _ in 0..3 {
        let counter = Arc::clone(&counter);
        let handle = thread::spawn(move || {
            // 此处不能直接修改 Arc 内的值
            let _ = counter;
        });
        handles.push(handle);
    }

    for handle in handles {
        handle.join().unwrap();
    }
    assert_eq!(*counter, 0);
    println!("Success!");
}
  1. 🌟🌟
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
// 填空:使用 Arc 在线程间共享向量长度
use std::sync::Arc;
use std::thread;

fn main() {
    let v = vec![1, 2, 3];
    let shared = Arc::new(v);
    let len = shared.len();

    let handle = thread::spawn(move || {
        len
    });

    assert_eq!(handle.join().unwrap(), 3);
    println!("Success!");
}

你可以在这里找到答案(在 solutions 路径下),但请只在需要时使用

最后修改 August 23, 2026: 更新 (499855b16)