知識マップ: マルチスレッドの実務ベストプラクティス C++編 ── RAIIとjthreadで事故を構造から消す

記事「マルチスレッドの実務ベストプラクティス C++編 ── RAIIとjthreadで事故を構造から消す」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

C++では、同期なしの共有可変アクセスは「壊れた値が読める」では済まず、規格上の未定義動作になります。コンパイラはデータ競合が存在しない前提で最適化するため、volatileの停止フラグがリリースビルドでだけ効かないといった事故が起きます。道具立てはRAIIが土台で、joinableなままstd::threadのデストラクタが走るとstd::terminateでプロセスが即死する一方、C++20のstd::jthreadはデストラクタで停止要求とjoinを自動で行います。ロックはlock_guardやscoped_lockに任せ、複数のミューテックスはscoped_lockにまとめて渡してデッドロック回避をライブラリに保証させます。単一変数の更新はstd::atomic、複数変数の整合はstd::mutexで、volatileは同期の道具ではありません。条件変数にはスプリアスウェイクアップがあるため待機は述語付きで書き、停止はstop_tokenによる協調停止で設計します。

C++のマルチスレッド設計ベストプラクティスの知識マップC++ではデータ競合がそのまま未定義動作になること、std::threadのデストラクタがstd::terminateを呼ぶ罠とjthreadによる解決、RAIIとscoped_lockによるロックの規律、atomicとvolatileの位置づけ、条件変数のスプリアスウェイクアップ、stop_tokenによる協調停止、Win32同期オブジェクトとの境界線を示す図原因になり得る原因になり得る用いるのは非推奨原因になり得るの後継実装を担う利用する実装を担う利用する原因になり得る原因になり得る原因になり得る実装を担う防止する防止するで構成できる防止する防止する用いるのは非推奨前提とする原因になり得る推奨される対応推奨される対応用いるのは非推奨原因になり得る両立しない推奨される対応データ競合による未定義動作共有可変状態競合状態(race condition)volatilestd::threadstd::terminatestd::jthreadRAII(Resource Acquisition Is Initialization)std::stop_token協調キャンセルstd::condition_variable_anystd::async / std::future並列化のオーバーヘッドPPLのparallel_for / parallel_for_eachC++17の並列アルゴリズム(std::execution::par)std::scoped_lockデッドロック(deadlock)ロック取得順序の統一std::mutexstd::shared_mutexstd::atomic複数変数にまたがる不変条件std::condition_variableスプリアスウェイクアッププロセス内の相互排他SRWロック(Slim Reader/Writer Lock)Win32同期オブジェクトDllMainとローダーロックPostMessageによるUIスレッドへの依頼UIスレッドのコンテキスト

概念間の関係(全27件)

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

主要概念の定義

データ競合による未定義動作
同じメモリ位置へ複数スレッドが同期なしにアクセスし、少なくとも一方が書き込みであるときにC++規格が定める未定義動作。コンパイラは競合が存在しない前提で最適化する。
共有可変状態
複数のスレッドから読み書きされる、書き換え可能なデータ。競合はこれと複数スレッドが揃ったときにだけ起きる。
volatile
最適化による読み書きの除去を抑える型修飾子。スレッド間の同期を保証するものではない。
std::thread
C++11のスレッドクラス。合流(join)と切り離し(detach)を呼び出し側が管理する。
std::jthread
C++20のスレッドクラス。デストラクタで自動的に停止要求を出してからjoinし、スレッド関数の先頭引数としてstop_tokenを受け取れる。
std::stop_token
停止要求が出されたかをスレッド側から観測するためのC++20の型。condition_variable_anyのwaitにも直接渡せる。
std::condition_variable_any
任意のロック型と組み合わせられるC++の条件変数。waitがstd::stop_tokenを直接受け取れる点がstd::condition_variableと異なる。
std::async / std::future
一発の非同期タスクを起動し、その結果をfutureで受け取るC++11の仕組み。
PPLのparallel_for / parallel_for_each
コレクションの全要素へ処理を並列に適用する、Parallel Patterns Libraryのアルゴリズム。
C++17の並列アルゴリズム(std::execution::par)
標準アルゴリズムに実行ポリシーを渡して並列実行させるC++17の仕組み。
std::scoped_lock
C++17のRAIIロックラッパー。構築時に1つ以上のミューテックスを取得し、デストラクタで解放する。
ロック取得順序の統一
複数のロックを取るとき、全スレッドが同じ順序で取ると決めるルール。
std::shared_mutex
読み取りを同時に許し、書き込みだけを排他するC++14の読み書きミューテックス。
std::atomic
単一変数への不可分な操作と、memory_orderにもとづく順序付けを提供するC++のテンプレート。
std::condition_variable
ミューテックスと組み合わせて、条件が満たされるまでスレッドを待たせるC++の同期プリミティブ。
std::mutex
プロセス内の相互排他を提供するC++標準ライブラリのミューテックス。
SRWロック(Slim Reader/Writer Lock)
Win32が提供する軽量な読み書きロック。再帰取得はできない。
Win32同期オブジェクト
イベント・Mutex・セマフォなど、Win32の待機APIで待てるカーネルオブジェクト。プロセスをまたいだ同期にも使える。
DllMainとローダーロック
DllMainがローダーロックを保持した状態で呼ばれるという制約。呼べるAPIが大きく限られる。
PostMessageによるUIスレッドへの依頼
ワーカースレッドから直接ウィンドウを触らず、非同期のメッセージ送出でUIスレッドに処理を依頼する形。

機械可読データ

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

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

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