你刚才提到的 Arc<...> 和 Weak<...> 是什么东西?

eeeeeeeeeeeeeee

Arc<T>Weak<T> 是 Rust 标准库中的引用计数智能指针类型,用于多线程共享所有权的数据,属于 std::sync 模块。它们广泛用于构建关系型对象模型(如主外键)、缓存引用、图结构等场景,尤其适合你目前这种对象间存在引用/关联的场景。


🧱 Arc<T>(Atomic Reference Counted)

  • 全称:原子引用计数智能指针
  • 多线程安全的 Rc<T>(单线程引用计数)。
  • 多个线程可以拥有同一份数据的共享所有权。

示例:

use std::sync::Arc;

let a = Arc::new(String::from("hello"));

let a1 = Arc::clone(&a); // 引用计数 +1
let a2 = Arc::clone(&a); // 引用计数 +1

println!("{}", a1);
println!("{}", a2); // 数据只存在一份

🕳️ Weak<T>(非拥有型弱引用)

  • 不增加引用计数(即不会阻止内存释放)。
  • 用于打破循环引用(典型的:对象 A 引用对象 B,B 又引用 A)。
  • 需要 upgrade() 才能访问实际数据(返回 Option<Arc<T>>)。

示例:

use std::sync::{Arc, Weak};

let strong = Arc::new(String::from("hello"));
let weak: Weak<String> = Arc::downgrade(&strong); // 弱引用

assert!(weak.upgrade().is_some()); // 返回 Some(Arc<T>)

drop(strong); // 强引用全部被释放

assert!(weak.upgrade().is_none()); // 数据已被回收

🧩 适用于你的场景:

你提到对象之间存在主外键、关联关系:

  • 使用 Arc<T> 存储对象本体,供多个地方共享引用。
  • 使用 Weak<T> 存储指向父对象或外键对象的引用,避免循环引用和内存泄漏。

举个例子:成员与维度

use std::sync::{Arc, Weak};

struct Dimension {
    gid: u64,
    name: String,
}

struct Member {
    gid: u64,
    name: String,
    dimension: Weak<Dimension>, // 不拥有维度,只是关联
}

// 构建示例数据
let dim = Arc::new(Dimension { gid: 1, name: "地区".to_string() });
let member = Member {
    gid: 100,
    name: "北京".to_string(),
    dimension: Arc::downgrade(&dim),
};

总结对比:

类型 是否线程安全 是否共享所有权 是否影响生命周期 适合场景
Arc<T> ✅ 是 ✅ 是 ✅ 会延长生命周期 多线程缓存、父子对象持有
Weak<T> ✅ 是 🚫 否 🚫 不影响生命周期 引用但不拥有(如外键、子指向父)

是否需要我帮你设计一个基于 ArcWeak 构建“对象之间主外键关联关系”的缓存结构模板?

posted on 2025-05-02 14:10  及途又八  阅读(61)  评论(0)    收藏  举报

导航