mcpField
M
m07-concurrency

m07-concurrency

github.com/actionbook開発1.6k3.6k 回インストール9 週間前に更新
リポジトリ

m07-concurrency について

Rust 開発者向けに、スレッド、非同期処理、データ共有の方式を選ぶスキルです。処理の種類や Send/Sync の要件に基づき、実装方法とよくあるエラーへの対処を整理します。

主な機能

  1. 01CPU バウンドと I/O バウンドの判別
  2. 02スレッドまたは非同期処理の選択
  3. 03共有とメッセージパッシング方式の比較
  4. 04Send/Sync と非同期処理のエラー対応

活用シーン

  1. 01処理に合った並行処理方式の選択
  2. 02Send または Sync のコンパイルエラー解決
  3. 03ロックとデッドロックのリスク確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/actionbook/rust-skills --skill m07-concurrency

インストール後、Claude Code で/m07-concurrencyを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

comparison.md
examples/
thread-patterns.md
patterns/
async-patterns.md
common-errors.md

詳細

並行処理

レイヤー 1:言語の仕組み

基本的な問い

これは CPU バウンドですか、それとも I/O バウンドですか。また、共有モデルはどうなっていますか?

並行処理のプリミティブを選ぶ前に、次の点を確認してください。

  • ワークロードの種類は何ですか?
  • 共有する必要があるデータは何ですか?
  • スレッドセーフ性の要件は何ですか?

エラー → 設計上の問い

エラーただこう言うのではなくこう問いかける
E0277 Send「Send 制約を追加する」この型はスレッド間をまたぐ必要がありますか?
E0277 Sync「Mutex でラップする」本当に共有アクセスが必要ですか?
Future not Send「spawn_local を使う」非同期処理は適切な選択ですか?
デッドロック「ロックの順序を変える」ロックの設計は適切ですか?

考えるための問い

並行処理を追加する前に、次の点を確認してください。

  1. ワークロードは何ですか?

    • CPU バウンド → スレッド(std::thread、rayon)
    • I/O バウンド → 非同期処理(tokio、async-std)
    • 混在 → ハイブリッド方式
  2. 共有モデルはどうなっていますか?

    • 共有なし → メッセージパッシング(チャネル)
    • 不変データの共有 → Arc
    • 可変データの共有 → Arc<Mutex> または Arc<RwLock>
  3. Send/Sync の要件は何ですか?

    • 所有権をスレッド間で移動 → Send
    • 参照をスレッド間で共有 → Sync
    • シングルスレッドの非同期処理 → spawn_local

上流へたどる ↑(必須)

重要:エラーを修正するだけではなく、上流へたどってドメインの制約を見つけてください。

ドメイン検出テーブル
コンテキストのキーワード読み込むドメインスキル主な制約
Web API、HTTP、axum、actix、ハンドラーdomain-webハンドラーはどのスレッドでも実行されます
交易、支払い、trading、paymentdomain-fintech監査とスレッドセーフ性
gRPC、kubernetes、マイクロサービスdomain-cloud-native分散トレーシング
CLI、ターミナル、clapdomain-cli通常はシングルスレッドで問題ありません
例:Web API + Rc エラー
"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<T> with State extractor
    ↓ IMPL: axum::extract::State<Arc<AppConfig>>
一般的なたどり方
"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?)
状況たどり先問い
Web における Send/Syncdomain-web状態管理のパターンは何ですか?
CLI における Send/Syncdomain-cli本当にマルチスレッドが必要ですか?
Mutex とチャネルの比較m09-domain共有状態とメッセージパッシングのどちらですか?
非同期処理とスレッドの比較m10-performanceワークロードのプロファイルはどうなっていますか?

下流へたどる ↓

設計から実装へ:

"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<T>

"Need to share mutable data across threads"
    ↓ Use: Arc<Mutex<T>> or Arc<RwLock<T>>
    ↓ Or: channels for message passing

"Need simple atomic operations"
    ↓ Use: AtomicBool, AtomicUsize, etc.

Send/Sync マーカー

マーカー意味例
Sendスレッド間で所有権を移動できるほとんどの型
Syncスレッド間で参照を共有できるArc<T>
!Send1 つのスレッド上にとどめる必要があるRc<T>
!Sync参照をスレッド間で共有できないRefCell<T>

クイックリファレンス

パターンスレッドセーフブロッキング使用場面
std::threadはいはいCPU バウンドの並列処理
async/awaitはいいいえI/O バウンドの並行処理
Mutex<T>はいはい共有された可変状態
RwLock<T>はいはい読み取りが多い共有状態
mpsc::channelはい任意メッセージパッシング
Arc<Mutex<T>>はいはいスレッド間で共有する可変状態

判断フローチャート

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<T>
└─ Mutable →
   ├─ Read-heavy → Arc<RwLock<T>>
   └─ Write-heavy → Arc<Mutex<T>>
   └─ Simple counter → AtomicUsize

Async context?
├─ Type is Send → tokio::spawn
├─ Type is !Send → spawn_local
└─ Blocking code → spawn_blocking

よくあるエラー

エラー原因修正方法
E0277 Send が満たされていない非同期処理内に Send でない型があるArc または spawn_local を使う
E0277 Sync が満たされていない共有されている型が Sync でないMutex でラップする
デッドロックロックの取得順序一貫したロック順序にする
future is not Sendawait をまたいで Send でない型があるawait の前にドロップする
MutexGuard が await をまたぐサスペンド中にガードが保持されているガードのスコープを適切に設定する

アンチパターン

アンチパターン問題点より良い方法
あらゆる箇所で Arc<Mutex> を使う競合、複雑さメッセージパッシング
非同期処理で thread::sleep を使うエグゼキューターをブロックするtokio::time::sleep
await をまたいでロックを保持する他のタスクをブロックするロックのスコープを最小限にする
デッドロックのリスクを無視するデバッグが困難ロック順序、try_lock

非同期処理固有のパターン

await をまたいで MutexGuard を保持しない
// 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;
非同期処理で Send でない型を使う
// 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

WhenSee
Smart pointer choicem02-resource
Interior mutabilitym03-mutability
Performance tuningm10-performance
Domain concurrency needsdomain-*

コメント