rust-concurrency-primitives について
Rustのスレッド並行処理を設計・レビューするスキルです。Rust開発者が調整要件に応じて所有権、チャネル、ロック、初期化プリミティブ、アトミックを選べるよう、安全性とテストの指針を示します。
主な機能
- 01並行処理パターンの分類
- 02プリミティブ選択の指針
- 03所有権と同期のルール
- 04ロックとアトミックの安全指針
- 05決定的な並行テストの助言
活用シーン
- 01プロデューサー・コンシューマーパイプラインの設計
- 02Rustスレッド間での状態共有
- 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 の並行処理を、所有権、共有、同期を明示して設計する際に、このスキルを使用してください。共有可変状態を追加する前に、連携要件に合った最も単純なプリミティブを優先してください。
基本的なワークフロー
- 作業を分類します。独立したフォーク・ジョイン、プロデューサー/コンシューマーパイプライン、共有状態、1 回限りの初期化、低レベルのアトミックな連携のいずれかです。
- スレッドごとに所有データを使用することを優先します。複数のスレッドでデータを参照または変更する必要がある場合にのみ、共有所有権を追加してください。
- 子スレッドがスタックデータを借用でき、関数の戻り前に終了する必要がある場合は、
std::thread::scopeを使用してください。 - 所有権の移動やパイプラインにはチャネルを使用してください。共有状態の方が明確なモデルである場合にのみ、
Arc<Mutex<T>>またはArc<RwLock<T>>を使用してください。 - ロックの保持範囲を短くし、保護対象の不変条件そのものである場合を除き、ロックを保持したままユーザー制御下のコードやブロッキングコードを呼び出さないでください。
- その場しのぎのグローバル可変状態の代わりに、スレッドセーフな 1 回限りの初期化には
OnceLockまたはLazyLockを使用してください。 - アトミックは特殊な用途のツールとして扱ってください。より弱い順序付けが妥当で、その理由が文書化されるまでは、デフォルトで
SeqCstを使用してください。
プリミティブの選択
新しい共有状態プリミティブを導入する場合や、デッドロックを起こしやすいコードをレビューする場合は、事前に references/threading-shared-state.md を読んでください。
| 必要な用途 | プリミティブ |
|---|---|
| 短命なスレッドにローカルデータを借用させる | std::thread::scope |
| 作業や結果を移動する | std::sync::mpsc またはプロジェクトのチャネルクレート |
| 共有読み書き状態 | Arc<Mutex<T>> |
| 読み取りが多く、書き込みがまれ | Arc<RwLock<T>> |
| 条件の変化を待つ | Mutex と組み合わせた Condvar |
| グローバルな 1 回限りの初期化 | LazyLock または OnceLock |
| カウンター、フラグ、ロックフリーな連携 | std::sync::atomic |
安全性とレビューのルール
- スレッド境界を越える値には
Sendを、複数のスレッドから使用する共有参照にはSyncを要求してください。 - パニック時にポイズニングを伝播させるか、
PoisonError::into_innerで回復するかを決めてください。 - 複数のロックを取得できる場合は、ロックの取得順序を定めてください。
- クローンした値が所有権ハンドルであり、可読性が重要な場合は、
value.clone()よりもArc::clone(&value)を優先してください。 - 問題が純粋な CPU データ並列処理であり、プロジェクトがすでにその依存関係を受け入れている場合は、データの並列イテレーションに Rayon を使用してください。
テスト
- 最終状態、メッセージ数、シャットダウンを対象とした決定的なテストを追加してください。
- テストの連携にはバリア、チャネル、またはスコープ付きスレッドを使用し、スリープは避けてください。
- コードが依存する場合は、パニック、送信側/受信側のドロップ、またはキャンセル動作を対象としたテストを少なくとも 1 つ追加してください。
コメント
Markdown 対応