关于 rust-concurrency-primitives
用于设计和审查 Rust 线程并发的技能,面向 Rust 开发者。它根据协调需求指导选择所有权、通道、锁、初始化原语和原子操作,并提供安全与测试建议。
主要功能
- 01并发模式分类
- 02并发原语选择指南
- 03所有权与同步规则
- 04锁与原子操作安全建议
- 05确定性并发测试建议
适用场景
- 01设计生产者—消费者流水线
- 02在 Rust 线程间共享状态
- 03审查容易死锁的代码
- 04测试取消与关闭行为
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ lvtd-llc/ skills --skill rust-concurrency-primitives安装后在 Claude Code 中输入/rust-concurrency-primitives确认已加载。
附带文件agents/openai.yamlreferences/threading-shared-state.md
详细介绍
Rust 并发原语
使用此技能设计基于线程的 Rust 并发,并明确所有权、共享和同步方式。在添加共享可变状态之前,优先选择满足协调需求的最简单原语。
核心工作流
- 对工作进行分类:独立的分叉-汇合、生产者/消费者管道、共享状态、一次性初始化或底层原子协调。
- 优先为每个线程提供其自有数据。只有在多个线程必须观察或修改数据时,才添加共享所有权。
- 当子线程可以借用栈数据,且必须在函数返回前完成时,使用
std::thread::scope。 - 使用通道转移所有权并构建管道。只有当共享状态是更清晰的模型时,才使用
Arc<Mutex<T>>或Arc<RwLock<T>>。 - 保持锁的持有范围尽可能短;除非锁保护的正是相关不变量,否则不要在持锁时调用由用户控制的代码或阻塞代码。
- 使用
OnceLock或LazyLock实现线程安全的一次性初始化,而不是采用临时的全局可变状态。 - 将原子操作视为专用工具。在有充分依据并记录说明之前,默认使用
SeqCst。
原语选择
在引入新的共享状态原语或审查易引发死锁的代码之前,请阅读 references/threading-shared-state.md。
| 需求 | 原语 |
|---|---|
| 将局部数据借用给短生命周期线程 | std::thread::scope |
| 转移工作或结果 | std::sync::mpsc 或项目使用的通道 crate |
| 共享读写状态 | Arc<Mutex<T>> |
| 多个读取者、极少写入者 | Arc<RwLock<T>> |
| 等待条件变化 | Condvar 和 Mutex |
| 一次性全局初始化 | LazyLock 或 OnceLock |
| 计数器、标志、无锁协调 | std::sync::atomic |
安全与审查规则
- 跨线程边界传递的值必须满足
Send;多个线程使用的共享引用必须满足Sync。 - 决定是否应传播中毒状态导致的 panic,还是通过
PoisonError::into_inner恢复。 - 如果可能获取多个锁,请明确锁的获取顺序。
- 当克隆的值是所有权句柄且可读性很重要时,优先使用
Arc::clone(&value),而不是value.clone()。 - 如果问题属于纯 CPU 数据并行,且项目已接受该依赖项,则使用 Rayon 进行数据并行迭代。
测试
- 针对最终状态、消息数量和关闭行为添加确定性测试。
- 使用屏障、通道或作用域线程协调测试;避免使用休眠。
- 如果代码依赖 panic、发送端或接收端被丢弃,或取消行为,请至少添加一个相应测试。
评论
支持 Markdown