🎯

m07-concurrency

🎯Skill

from goooice/rust-skills

VibeIndex|
What it does

Diagnoses and resolves Rust concurrency challenges by tracing domain constraints and selecting appropriate threading, async, and synchronization strategies.

πŸ“¦

Part of

goooice/rust-skills(35 items)

m07-concurrency

Installation

Add MarketplaceAdd marketplace to Claude Code
/plugin marketplace add ZhangHanDong/rust-skills
Install PluginInstall plugin from marketplace
/plugin install rust-skills@rust-skills
Quick InstallInstall with npx
npx skills add ZhangHanDong/rust-skills
git cloneClone repository
git clone https://github.com/ZhangHanDong/rust-skills.git
πŸ“– Extracted from docs: goooice/rust-skills
4Installs
-
AddedFeb 4, 2026

Skill Details

SKILL.md

"CRITICAL: Use for concurrency/async. Triggers: E0277 Send Sync, cannot be sent between threads, thread, spawn, channel, mpsc, Mutex, RwLock, Atomic, async, await, Future, tokio, deadlock, race condition, 幢发, 线程, εΌ‚ζ­₯, 死锁"

Overview

# Concurrency

> Layer 1: Language Mechanics

Core Question

Is this CPU-bound or I/O-bound, and what's the sharing model?

Before choosing concurrency primitives:

  • What's the workload type?
  • What data needs to be shared?
  • What's the thread safety requirement?

---

Error β†’ Design Question

| Error | Don't Just Say | Ask Instead |

|-------|----------------|-------------|

| E0277 Send | "Add Send bound" | Should this type cross threads? |

| E0277 Sync | "Wrap in Mutex" | Is shared access really needed? |

| Future not Send | "Use spawn_local" | Is async the right choice? |

| Deadlock | "Reorder locks" | Is the locking design correct? |

---

Thinking Prompt

Before adding concurrency:

  1. What's the workload?

- CPU-bound β†’ threads (std::thread, rayon)

- I/O-bound β†’ async (tokio, async-std)

- Mixed β†’ hybrid approach

  1. What's the sharing model?

- No sharing β†’ message passing (channels)

- Immutable sharing β†’ Arc

- Mutable sharing β†’ Arc> or Arc>

  1. What are the Send/Sync requirements?

- Cross-thread ownership β†’ Send

- Cross-thread references β†’ Sync

- Single-thread async β†’ spawn_local

---

Trace Up ↑ (MANDATORY)

CRITICAL: Don't just fix the error. Trace UP to find domain constraints.

Domain Detection Table

| Context Keywords | Load Domain Skill | Key Constraint |

|-----------------|-------------------|----------------|

| Web API, HTTP, axum, actix, handler | domain-web | Handlers run on any thread |

| δΊ€ζ˜“, ζ”―δ»˜, trading, payment | domain-fintech | Audit + thread safety |

| gRPC, kubernetes, microservice | domain-cloud-native | Distributed tracing |

| CLI, terminal, clap | domain-cli | Usually single-thread OK |

Example: Web API + Rc Error

```

"Rc cannot be sent between threads" in Web API context

↑ DETECT: "Web API" β†’ Load domain-web

↑ FIND: domain-web says "Shared state must be thread-safe"

↑ FIND: domain-web says "Rc in state" is Common Mistake

↓ DESIGN: Use Arc with State extractor

↓ IMPL: axum::extract::State>

```

Generic Trace

```

"Send not satisfied for my type"

↑ Ask: What domain is this? Load domain-* skill

↑ Ask: Does this type need to cross thread boundaries?

↑ Check: m09-domain (is the data model correct?)

```

| Situation | Trace To | Question |

|-----------|----------|----------|

| Send/Sync in Web | domain-web | What's the state management pattern? |

| Send/Sync in CLI | domain-cli | Is multi-thread really needed? |

| Mutex vs channels | m09-domain | Shared state or message passing? |

| Async vs threads | m10-performance | What's the workload profile? |

---

Trace Down ↓

From design to implementation:

```

"Need parallelism for CPU work"

↓ Use: std::thread or rayon

"Need concurrency for I/O"

↓ Use: async/await with tokio

"Need to share immutable data across threads"

↓ Use: Arc

"Need to share mutable data across threads"

↓ Use: Arc> or Arc>

↓ Or: channels for message passing

"Need simple atomic operations"

↓ Use: AtomicBool, AtomicUsize, etc.

```

---

Send/Sync Markers

| Marker | Meaning | Example |

|--------|---------|---------|

| Send | Can transfer ownership between threads | Most types |

| Sync | Can share references between threads | Arc |

| !Send | Must stay on one thread | Rc |

| !Sync | No shared refs across threads | RefCell |

Quick Reference

| Pattern | Thread-Safe | Blocking | Use When |

|---------|-------------|----------|----------|

| std::thread | Yes | Yes | CPU-bound parallelism |

| async/await | Yes | No | I/O-bound concurrency |

| Mutex | Yes | Yes | Shared mutable state |

| RwLock | Yes | Yes | Read-heavy shared state |

| mpsc::channel | Yes | Optional | Message passing |

| Arc> | Yes | Yes | Shared mutable across threads |

Decision Flowchart

```

What type of work?

β”œβ”€ CPU-bound β†’ std::thread or rayon

β”œβ”€ I/O-bound β†’ async/await

└─ Mixed β†’ hybrid (spawn_blocking)

Need to share data?

β”œβ”€ No β†’ message passing (channels)

β”œβ”€ Immutable β†’ Arc

└─ Mutable β†’

β”œβ”€ Read-heavy β†’ Arc>

└─ Write-heavy β†’ Arc>

└─ Simple counter β†’ AtomicUsize

Async context?

β”œβ”€ Type is Send β†’ tokio::spawn

β”œβ”€ Type is !Send β†’ spawn_local

└─ Blocking code β†’ spawn_blocking

```

---

Common Errors

| Error | Cause | Fix |

|-------|-------|-----|

| E0277 Send not satisfied | Non-Send in async | Use Arc or spawn_local |

| E0277 Sync not satisfied | Non-Sync shared | Wrap with Mutex |

| Deadlock | Lock ordering | Consistent lock order |

| future is not Send | Non-Send across await | Drop before await |

| MutexGuard across await | Guard held during suspend | Scope guard properly |

---

Anti-Patterns

| Anti-Pattern | Why Bad | Better |

|--------------|---------|--------|

| Arc> everywhere | Contention, complexity | Message passing |

| thread::sleep in async | Blocks executor | tokio::time::sleep |

| Holding locks across await | Blocks other tasks | Scope locks tightly |

| Ignoring deadlock risk | Hard to debug | Lock ordering, try_lock |

---

Async-Specific Patterns

Avoid MutexGuard Across Await

```rust

// Bad: guard held across await

let guard = mutex.lock().await;

do_async().await; // guard still held!

// Good: scope the lock

{

let guard = mutex.lock().await;

// use guard

} // guard dropped

do_async().await;

```

Non-Send Types in Async

```rust

// Rc is !Send, can't cross await in spawned task

// Option 1: use Arc instead

// Option 2: use spawn_local (single-thread runtime)

// Option 3: ensure Rc is dropped before .await

```

---

Related Skills

| When | See |

|------|-----|

| Smart pointer choice | m02-resource |

| Interior mutability | m03-mutability |

| Performance tuning | m10-performance |

| Domain concurrency needs | domain-* |

More from this repository10

🎯
m10-performance🎯Skill

Optimizes code performance by identifying bottlenecks, measuring impact, and guiding strategic improvements across algorithm, data structure, and memory efficiency.

🎯
m14-mental-model🎯Skill

Applies the M14 mental model framework to enhance decision-making and strategic thinking through structured cognitive analysis.

🎯
m04-zero-cost🎯Skill

Guides developers in choosing zero-cost abstractions by analyzing type system constraints and performance trade-offs in Rust generics and traits.

🎯
meta-cognition-parallel🎯Skill

Performs parallel three-layer meta-cognitive analysis by forking subagents to simultaneously analyze language mechanics, design choices, and domain constraints, then synthesizing results.

🎯
unsafe-checker🎯Skill

Identifies and reviews unsafe Rust code patterns, FFI risks, and potential memory unsafety in Rust projects.

🎯
rust-skill-creator🎯Skill

Dynamically generates Claude skills for Rust crates, standard library modules, and documentation by extracting and processing technical details from specified URLs.

🎯
coding-guidelines🎯Skill

Provides comprehensive Rust coding guidelines covering naming conventions, best practices, error handling, memory management, concurrency, and code style recommendations.

🎯
rust-refactor-helper🎯Skill

Performs safe Rust refactoring by analyzing symbol references, checking conflicts, and applying changes across project files using LSP.

🎯
m03-mutability🎯Skill

Diagnoses and guides resolution of Rust mutability and borrowing conflicts by analyzing ownership, mutation patterns, and thread-safety requirements.

🎯
m05-type-driven🎯Skill

Explores and demonstrates type-driven development techniques in Rust, showcasing advanced type system features and pattern matching strategies.