mcpField
R
rust-concurrency-primitives

rust-concurrency-primitives

github.com/lvtd-llc开发161 次安装8 周前更新
代码仓库

关于 rust-concurrency-primitives

用于设计和审查 Rust 线程并发的技能,面向 Rust 开发者。它根据协调需求指导选择所有权、通道、锁、初始化原语和原子操作,并提供安全与测试建议。

主要功能

  1. 01并发模式分类
  2. 02并发原语选择指南
  3. 03所有权与同步规则
  4. 04锁与原子操作安全建议
  5. 05确定性并发测试建议

适用场景

  1. 01设计生产者—消费者流水线
  2. 02在 Rust 线程间共享状态
  3. 03审查容易死锁的代码
  4. 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 并发,并明确所有权、共享和同步方式。在添加共享可变状态之前,优先选择满足协调需求的最简单原语。

核心工作流

  1. 对工作进行分类:独立的分叉-汇合、生产者/消费者管道、共享状态、一次性初始化或底层原子协调。
  2. 优先为每个线程提供其自有数据。只有在多个线程必须观察或修改数据时,才添加共享所有权。
  3. 当子线程可以借用栈数据,且必须在函数返回前完成时,使用 std::thread::scope。
  4. 使用通道转移所有权并构建管道。只有当共享状态是更清晰的模型时,才使用 Arc<Mutex<T>> 或 Arc<RwLock<T>>。
  5. 保持锁的持有范围尽可能短;除非锁保护的正是相关不变量,否则不要在持锁时调用由用户控制的代码或阻塞代码。
  6. 使用 OnceLock 或 LazyLock 实现线程安全的一次性初始化,而不是采用临时的全局可变状态。
  7. 将原子操作视为专用工具。在有充分依据并记录说明之前,默认使用 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