> 作者:小黎的部落 | 日期:2026-10-30 | 系列:Rust 基础设施工具集

一、为什么需要 orca-arc?

Rust 标准库提供了 std::sync::Arc,但它只解决了最基本的共享所有权问题。在实际项目中,我们经常遇到这些场景:

orca-arc 在标准库 Arc 之上提供了五个高级抽象,精准解决上述问题。

二、核心组件

2.1 ArcSwap — 无锁热更新

ArcSwap 是最常用的组件。它允许你在不阻塞读取的情况下原子替换 Arc 指针。

设计原理:内部使用 AtomicPtr 实现无锁读写。读取操作只需要一次原子加载,写入操作使用 CAS(Compare-And-Swap)循环。

use orca_arc::ArcSwap;
use std::sync::Arc;

// 初始化配置
let config = ArcSwap::new(Arc::new(AppConfig {
    max_connections: 100,
    timeout_ms: 5000,
}));

// 读取线程(无锁,极低延迟)
let current = config.load();
println!("当前最大连接数: {}", current.max_connections);

// 热更新(不阻塞读取)
config.store(Arc::new(AppConfig {
    max_connections: 200,
    timeout_ms: 3000,
}));

适用场景:

2.2 ArcPool — 对象池

频繁分配和释放大对象会导致内存碎片和 GC 压力。ArcPool 通过预分配和复用解决这个问题。

use orca_arc::ArcPool;

// 创建缓冲区对象池
let pool = ArcPool::new(|| vec![0u8; 4096]);

// 从池中获取(复用已有对象)
let buf = pool.acquire();
// 使用 buf...

// 归还池中(Drop 时自动归还)
drop(buf);

适用场景:

2.3 ArcCow — 写时复制

标准库的 Cow 只支持 &str / String 等特定类型。ArcCow 将其扩展到任意 Arc。

use orca_arc::ArcCow;
use std::sync::Arc;

let data = ArcCow::new(Arc::new(vec![1, 2, 3]));

// 读取:共享引用,零拷贝
let view = data.read();
assert_eq!(*view, vec![1, 2, 3]);

// 写入:自动克隆,不影响其他持有者
let mut write = data.write();
write.push(4);
assert_eq!(*write, vec![1, 2, 3, 4]);

适用场景:

2.4 WeakMap — 弱引用映射

标准库的 Weak 需要手动升级和检查。WeakMap 自动清理过期条目。

use orca_arc::WeakMap;
use std::sync::Arc;

let cache = WeakMap::new();

// 插入缓存
let data = Arc::new("cached_value");
cache.insert("key1", Arc::downgrade(&data));

// 当原始 Arc 被释放后,WeakMap 自动清理
drop(data);
// cache 中 "key1" 自动变为 None

适用场景:

2.5 ArcExt — 扩展方法

提供 Arc 的便捷扩展方法,简化常见操作。

三、性能分析

操作标准 Arcorca-arc提升
热更新配置需要 RwLock 包装无锁原子操作~10x
对象复用每次分配新对象池化复用~5x
写时复制手动 clone自动延迟克隆零开销(只读路径)

四、与其他方案对比

方案优点缺点
`arc-swap` crate成熟稳定仅提供 ArcSwap,无对象池/写时复制
手动 RwLock>标准库读写互斥,性能差
orca-arc五合一,API 统一较新,社区生态待建设

五、总结

orca-arc 是一个小而美的工具库,在标准库 Arc 之上提供了五个精准的高级抽象。如果你需要在 Rust 项目中实现热更新配置、对象池复用或写时复制,orca-arc 是一个值得尝试的选择。

六、下载

下载 orca-arc.tar.gz (8.8 KB)

← 返回文章列表