478 字
2 分钟
Rust 学习笔记 · 智能指针(3):Arc 与跨线程共享
智能指针(3):Arc 与跨线程共享
把共享所有权扩展到线程之间,并区分原子引用计数与内部数据同步。
学习日期:2026-10-11。本篇与同日的「智能指针」其他篇章合计为一个模块、一天学习量。
文中的完整代码保留当前示例的有效语句,省去原文件中的注释与已注释实验行;实验变体另行说明。运行命令在项目根目录执行,示例名称由 Cargo.toml 注册。
Arc:跨线程共享所有权
Arc<T> 使用原子引用计数。在内部类型满足约束时,多个线程可以通过不同的 Arc 句柄共享同一个值。
子线程获得 worker_message,主线程保留 message。两边都能读取同一字符串;join() 得到子线程返回的长度 5。等待结束后子线程句柄已释放,剩余强引用为 1。
use std::sync::Arc;use std::thread;
fn main() { let message = Arc::new(String::from("hello")); let worker_message = Arc::clone(&message);
let handle = thread::spawn(move || { println!("子线程: {}", worker_message); worker_message.len() });
println!("主线程: {}", message); let length = handle.join().unwrap();
println!("子线程返回: {}", length); println!("剩余强引用: {}", Arc::strong_count(&message));}运行:
cargo run --example arc_basic本次本地运行的标准输出如下。并发日志只代表这次运行,先后关系以正文说明为准。
主线程: hello子线程: hello子线程返回: 5剩余强引用: 1理解与实验
主线程与子线程的两条读取日志可能交换顺序,但获取返回值的日志发生在 join() 成功之后。
Arc 解决的是所有权和引用计数安全,不会自动允许修改任意内部数据。共享修改仍需 Mutex、RwLock、原子类型等机制,具体取决于数据与访问方式。
同模块笔记
标准库参考
Rust 学习笔记
连载中Rust 学习笔记 · 智能指针(3):Arc 与跨线程共享
https://shirone.mysqil.com/posts/rust/smart-pointers-3/分享文章
生成精美分享图或复制链接,与更多人分享本文。
继续阅读
换条路线
从其他文章中稳定抽取
最后更新于 ,距今已过 4 天
部分内容可能已过时