知識マップ: マルチスレッドの実務ベストプラクティス C言語編 ── Win32 APIの流儀で安全に書く

記事「マルチスレッドの実務ベストプラクティス C言語編 ── Win32 APIの流儀で安全に書く」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

Cではロックの解放を保証する言語機構がないため、原則を規律として明文化する必要があります。スレッド作成はCRTのスレッドごとデータを初期化する_beginthreadexが一択で、CreateThreadで作ったスレッドがCRTを呼ぶとメモリ不足時にプロセスが終了させられることがあります。短命な仕事はWindowsスレッドプールへ委譲します。プロセス内のロックはSRWロックが既定で、再帰取得が必要なときだけCRITICAL_SECTION、常にカーネル遷移を伴うMutexをプロセス内の排他に使うのはよくある間違いです。単一変数の更新はInterlocked関数で行い、対象は自然な境界に整列している必要があります。待ち合わせは条件変数で、スプリアスウェイクアップがあるため目覚めたら条件を再確認します。TerminateThreadはロック・ヒープ・DLLの状態を壊すため使わず、停止イベントとWaitForMultipleObjectsによる協調停止を組みます。

C言語(Win32)のマルチスレッド設計ベストプラクティスの知識マップCRTを呼ぶスレッドを_beginthreadexで作る理由、Windowsスレッドプールへの委譲、SRWロック・CRITICAL_SECTION・Mutexの使い分け、Interlockedと整列の前提、条件変数とスプリアスウェイクアップ、TerminateThreadが壊すものと停止イベントによる協調停止、DllMainのローダーロックを示す図原因になり得る両立しない実装を担うの後継両立しない前提とする推奨される対応推奨される対応用いるのは非推奨防止する前提とする用いるのは非推奨軽減する利用する原因になり得る実装を担うの後継原因になり得るの後継実装を担う防止する原因になり得る用いるのは非推奨共有可変状態競合状態(race condition)CreateThreadCRT(Cランタイムライブラリ)_beginthreadexWindowsスレッドプールTerminateThreadbackpressureSRWロック(Slim Reader/Writer Lock)プロセス内の相互排他CRITICAL_SECTIONWin32のMutexオブジェクトInterlocked関数変数の整列(アラインメント)volatileスレッドローカル状態Win32の条件変数スプリアスウェイクアップ有限バッファーポーリングによる待機デッドロック(deadlock)停止イベント+WaitForMultipleObjects協調キャンセルロック取得順序の統一DllMainとローダーロックC11スレッド()Windows専用のコードベース

概念間の関係(全23件)

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

主要概念の定義

共有可変状態
複数のスレッドから読み書きされる、書き換え可能なデータ。競合はこれと複数スレッドが揃ったときにだけ起きる。
競合状態(race condition)
複数のスレッドがどの順序で特定のコードに到達するかによって結果が変わってしまう不具合。
CreateThread
スレッドを作成するWin32のネイティブAPI。CRTのスレッドごとデータは初期化しない。
_beginthreadex
CRTがスレッドごとに使う内部データを初期化してからスレッドを開始する、CRT提供のスレッド作成関数。返したハンドルは呼び出し側がCloseHandleで閉じる。
Windowsスレッドプール
CreateThreadpoolWorkで作った仕事オブジェクトをSubmitThreadpoolWorkで投函すると、プールのワーカースレッドがコールバックを実行するWindowsの仕組み。
SRWロック(Slim Reader/Writer Lock)
Win32が提供する軽量な読み書きロック。再帰取得はできない。
CRITICAL_SECTION
スピンしてからカーネル待機に落ちる、プロセス内専用のWin32ロック。同一スレッドの再帰取得ができる。
Win32のMutexオブジェクト
常にカーネルオブジェクトとして作られるWin32の相互排他オブジェクト。名前を付ければプロセスをまたいで開き直せる。
Interlocked関数
複数スレッドで共有される変数へのアクセスを同期し、読み込み・加算・書き戻しのような操作を不可分に行うWin32の関数群。
volatile
最適化による読み書きの除去を抑える型修飾子。スレッド間の同期を保証するものではない。
スレッドローカル状態
各スレッドが自分だけの領域に持つ中間状態。並列ループで共有メモリへ書き込まずに集計するために使う。
Win32の条件変数
InitializeConditionVariableで作り、SleepConditionVariableCS/SRWで待ち、WakeConditionVariableで起こすWin32の待ち合わせ機構。
有限バッファー
容量に上限を設けたキュー・循環バッファー。満杯になったら生産側を待たせることが自然な背圧になる。
TerminateThread
対象スレッドにユーザーモードコードを一切実行させずに終了させるWin32 API。
停止イベント+WaitForMultipleObjects
手動リセットの停止イベントを1つ作り、各ワーカーが「仕事の合図」と「停止の合図」を同時に待つ、Win32での協調停止の定石。
ロック取得順序の統一
複数のロックを取るとき、全スレッドが同じ順序で取ると決めるルール。
DllMainとローダーロック
DllMainがローダーロックを保持した状態で呼ばれるという制約。呼べるAPIが大きく限られる。
C11スレッド(<threads.h>)
thrd_create・mtx_lock・cnd_waitなどからなる、C11標準の移植可能なスレッドAPI。

機械可読データ

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

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

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