知識マップ: マルチスレッドの実務ベストプラクティス .NET編 ── スレッドを増やす前に決めておくこと

記事「マルチスレッドの実務ベストプラクティス .NET編 ── スレッドを増やす前に決めておくこと」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

マルチスレッドが持ち込む問題は、実行順で結果が変わる競合状態と、互いのロックを待ち合うデッドロックの2種類です。競合は複数スレッドと共有可変状態が揃ったときにだけ起きるので、正しく同期するより先に同期が必要な場所を減らすのが設計の背骨になります。.NETではスレッドを自作せずTPLとスレッドプールに乗り、データ並列はParallel.For系に任せます。ただし1反復が軽いループは並列化のオーバーヘッドで逆に遅くなり、反復同士を待ち合わせるコードはデッドロックします。共有はスレッドローカル状態への分割やチャネルでの受け渡しで減らし、残った共有だけを専用ロックオブジェクトで守り、複数ロックの取得順序を統一します。停止はCancellationTokenによる協調キャンセルが唯一の正解で、Thread.Abortは.NET 5以降では実行時例外になります。UIは作成したスレッドの専有物で、別スレッドからはInvokeやDispatcher経由で依頼します。

.NETのマルチスレッド設計ベストプラクティスの知識マップ共有可変状態が競合状態を生む構図と、スレッドを自作せずTPLとスレッドプールに乗ること、分割・キューでの受け渡しによる共有の削減、ロックの規律とデッドロック対策、協調キャンセルによる停止設計、UIスレッドへの依頼という4原則の関係を示す図原因になり得る防止するで確認できるの後継利用する自動化する利用する実装を担う原因になり得る原因になり得る軽減する防止する実装を担う実装を担うの後継用いるのは非推奨軽減する両立しない実装を担う防止する防止する実装を担う利用するの後継の後継推奨される対応原因になり得る推奨される対応競合状態(race condition)共有可変状態ロック取得順序の統一デッドロック(deadlock)Monitor.TryEnter(タイムアウト付き)TPL(Task Parallel Library)スレッドの自作(new Thread)マネージドスレッドプール非同期I/OParallel.For / Parallel.ForEach並列化のオーバーヘッドスレッドローカル状態ChannelbackpressureBlockingCollectionスレッドセーフなコレクション型専用ロックオブジェクトlockステートメントplain awaitSemaphoreSlimInterlockedReaderWriterLockSlimCancellationToken協調キャンセル待機ハンドルによる待機Thread.Abortポーリングによる待機Control.Invoke / InvokeAsyncUIスレッドのコンテキストDispatcher(WPF)

概念間の関係(全28件)

図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。

主要概念の定義

競合状態(race condition)
複数のスレッドがどの順序で特定のコードに到達するかによって結果が変わってしまう不具合。
共有可変状態
複数のスレッドから読み書きされる、書き換え可能なデータ。競合はこれと複数スレッドが揃ったときにだけ起きる。
ロック取得順序の統一
複数のロックを取るとき、全スレッドが同じ順序で取ると決めるルール。
デッドロック(deadlock)
複数のタスクが互いの完了やリソース解放を待ち続け、永遠に進行しなくなる状態である。
TPL(Task Parallel Library)
.NET Framework 4以降のマルチスレッド・並列コードの推奨手段となるAPI群。仕事の分割・スレッドプールへのスケジューリング・キャンセル対応・状態管理を引き受ける。
マネージドスレッドプール
システムが管理するワーカースレッドのプールを提供し、開発者がスレッド管理ではなくアプリのタスクに集中できるようにする仕組み。
非同期I/O
要求を発行した呼び出しがI/Oの完了を待たずにすぐ戻り、完了を別途の通知(イベント・APC・I/O完了ポートなど)で受け取るI/Oの形態。
Parallel.For / Parallel.ForEach
forループとほぼ同じ書き味でデータ並列を提供するTPLのAPI。データソースの分割と負荷の再配分をランタイムが行う。
スレッドローカル状態
各スレッドが自分だけの領域に持つ中間状態。並列ループで共有メモリへ書き込まずに集計するために使う。
Channel<T>
producer/consumerの形をWriteAsync/ReadAsyncで書けるキュー。境界付き(bounded)にするとbackpressureが働く。
BlockingCollection<T>
ブロッキングと容量制限を備えた同期的なプロデューサー/コンシューマー実装。
スレッドセーフなコレクション型
System.Collections.Concurrent名前空間が提供する、複数スレッドから同時に更新しても壊れないコレクション型。通常のハッシュテーブルやListの代わりに使う。
専用ロックオブジェクト
外部に公開しない、ロック専用のインスタンス。.NET 9 / C# 13以降はSystem.Threading.Lock型を使う。
lockステートメント
C#のlockステートメントとSystem.Threading.Lock型によるモニターベースの排他。取得したスレッドが解放も担うスレッド親和性を持つ。
SemaphoreSlim
WaitAsyncで非同期に入り、Releaseで抜ける.NETの同期プリミティブ。並列数の上限指定や、awaitをまたぐ排他制御に使う。
Interlocked
単一変数の原子的な増減・加算・比較交換を提供するクラス。競合がなければ単一のCPU命令プレフィックスで済む。
ReaderWriterLockSlim
書き込みは排他、読み取りは同時アクセス可とする同期プリミティブ。
CancellationToken
キャンセル要求を伝えるための構造体。CancellationTokenSourceが要求を出し、リスナーがそれを監視する。
協調キャンセル
キャンセルを強制ではなく要求として伝え、停止の仕方はリスナー側が決めるモデル。
待機ハンドルによる待機
ManualResetEventSlimやSemaphoreSlimなどの同期プリミティブで、シグナル状態になるまでスレッドを休ませる待ち方。
Control.Invoke / InvokeAsync
WinFormsで、別スレッドからUIスレッドへ処理を依頼するためのメソッド。
Dispatcher(WPF)
WPFのUIスレッド上で処理を順番に実行するためのメッセージキューを管理するクラス。DispatcherTimerのTickもこのキューに積まれる。

機械可読データ

このデータセットについて

作成
合同会社小村ソフト
ライセンス
CC BY 4.0 ── 出典(合同会社小村ソフト)とライセンスへのリンクを明示し、改変した場合はその旨を示すことを条件に、再配布・改変を含めて再利用できます
最終確認日
2026-08-22 ── 収録する関係のうち、最後に出典と照合した日

このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。