並行性サポートライブラリ (C++11以降)
C++は、スレッド、アトミック操作、相互排他、条件変数、futureの組み込みサポートを含んでいます。
目次 |
[編集] スレッド
スレッドは、プログラムが複数のプロセッサコアにわたって実行されることを可能にします。
| ヘッダ
<thread> で定義 | |
| (C++11) |
個別のスレッドを管理する (class) |
| (C++20) |
std::thread 自動joinとキャンセルをサポート (class) |
現在のスレッドを管理する関数 | |
| 名前空間
this_thread 内で定義 | |
| (C++11) |
実装がスレッドの実行を再スケジュールすることを示唆する (関数) |
| (C++11) |
現在のスレッドのスレッドIDを返す (関数) |
| (C++11) |
指定された時間だけ現在のスレッドの実行を停止する (関数) |
| (C++11) |
指定された時間点まで現在のスレッドの実行を停止する (関数) |
[編集] 協調的なキャンセル (C++20以降)
コンポーネントである停止ソース (stop source)、停止トークン (stop token)、停止コールバック (stop callback) は、操作の実行を適時に停止するよう非同期に要求するために使用できます。これは通常、結果がもはや必要でなくなった場合に行われます。このような要求は停止要求 (stop request) と呼ばれます。
これらのコンポーネントは、停止状態 (stop state) への共有アクセスのセマンティクスを規定します。同じ停止状態を参照するこれらのコンポーネントをモデル化するオブジェクトは、それぞれ関連する停止ソース、停止トークン、または停止コールバックとなります。
|
コンセプト |
(C++26以降) |
これらは以下のように設計されています
- std::jthread のように実行を協調的にキャンセルするため、
- std::condition_variable_any の待機関数を中断するため、
|
(C++26以降) |
- またはカスタムの実行管理実装のため。
実際には、これらは何かを「停止」するために使用する必要さえなく、代わりに例えばスレッドセーフな一度だけの関数呼び出しトリガーとして使用することもできます。
| ヘッダ
<stop_token> で定義 | |
停止トークン型 | |
| (C++20) |
std::jthread のキャンセル要求が行われたかどうかを問い合わせるためのインターフェース (クラス) |
| (C++26) |
停止が不可能であり、要求もされない停止トークンインターフェースを提供する (クラス) |
| (C++26) |
関連する std::inplace_stop_source オブジェクトの停止状態を参照する停止トークン(クラス) |
停止ソース型 | |
| (C++20) |
1つ以上の std::jthread を停止する要求を表すクラス (クラス) |
| (C++26) |
停止状態の唯一の所有者である stoppable-source(クラス) |
停止コールバック型 | |
| (C++20) |
std::jthread のキャンセル時にコールバックを登録するためのインターフェース (クラステンプレート) |
| (C++26) |
std::inplace_stop_token 用の停止コールバック(クラステンプレート) |
| (C++26) |
与えられた停止トークン型に対するコールバック型を取得する (エイリアステンプレート) |
コンセプト (C++20以降) | |
| (C++26) |
停止要求の問い合わせと停止要求が可能かどうかを許可する停止トークンの基本インターフェースを規定する (コンセプト) |
| (C++26) |
停止を許可しない停止トークンを規定する (コンセプト) |
| (C++26) |
型が関連する停止トークンのファクトリであり、それに対して停止要求が行えることを規定する (説明専用コンセプト*) |
| (C++26) |
与えられた停止トークン型にコールバックを登録するためのインターフェースを規定する (説明専用コンセプト*) |
[編集] キャッシュサイズへのアクセス (C++17以降)
| ヘッダ
<new> で定義 | |
| 偽共有を避けるための最小オフセット 真の共有を促進するための最大オフセット (定数) | |
[編集] アトミック操作
これらのコンポーネントは、ロックレスな並行プログラミングを可能にするための、粒度の細かいアトミック操作を提供します。各アトミック操作は、同じオブジェクトが関与する他のどのアトミック操作に対しても不可分です。アトミックオブジェクトはデータ競合を起こしません。
| ヘッダー
<atomic> で定義 | |
アトミック型 | |
| (C++11) |
アトミッククラステンプレートと、bool、整数、浮動小数点数、(C++20以降)、ポインタ型のための特殊化 (クラステンプレート) |
| (C++20) |
非アトミックオブジェクトに対してアトミック操作を提供する (クラステンプレート) |
アトミック型に対する操作 | |
| (C++11) |
アトミック型の操作がロックフリーであるかを確認する (関数テンプレート) |
| (C++11)(C++11) |
アトミックオブジェクトの値を非アトミックな引数でアトミックに置き換える (関数テンプレート) |
| (C++11)(C++11) |
アトミックオブジェクトに格納されている値をアトミックに取得する (関数テンプレート) |
| (C++11)(C++11) |
アトミックオブジェクトの値を非アトミックな引数でアトミックに置き換え、アトミックオブジェクトの古い値を返す (関数テンプレート) |
| アトミックオブジェクトの値と非アトミックな引数をアトミックに比較し、等しければアトミック交換を、そうでなければアトミックロードを実行する (関数テンプレート) | |
| (C++11)(C++11) |
アトミックオブジェクトに非アトミックな値を加算し、アトミックオブジェクトの以前の値を取得する (関数テンプレート) |
| (C++11)(C++11) |
アトミックオブジェクトから非アトミックな値を減算し、アトミックオブジェクトの以前の値を取得する (関数テンプレート) |
| (C++11)(C++11) |
アトミックオブジェクトを非アトミックな引数とのビット単位ANDの結果で置き換え、アトミックオブジェクトの以前の値を取得する (関数テンプレート) |
| (C++11)(C++11) |
アトミックオブジェクトを非アトミックな引数とのビット単位ORの結果で置き換え、アトミックオブジェクトの以前の値を取得する (関数テンプレート) |
| (C++11)(C++11) |
アトミックオブジェクトを非アトミックな引数とのビット単位XORの結果で置き換え、アトミックオブジェクトの以前の値を取得する (関数テンプレート) |
| (C++26)(C++26) |
アトミックオブジェクトを非アトミックな引数との std::max の結果で置き換え、アトミックオブジェクトの以前の値を取得する (関数テンプレート) |
| (C++26)(C++26) |
アトミックオブジェクトを非アトミックな引数との std::min の結果で置き換え、アトミックオブジェクトの以前の値を取得する (関数テンプレート) |
| (C++20)(C++20) |
通知され、かつアトミックな値が変更されるまでスレッドをブロックする (関数テンプレート) |
| (C++20) |
atomic_waitでブロックされているスレッドに通知する (関数テンプレート) |
| (C++20) |
atomic_waitでブロックされている全てのスレッドに通知する (関数テンプレート) |
フラグ型と操作 | |
| (C++11) |
ロックフリーなブール型アトミック型 (クラス) |
| フラグをアトミックに true に設定し、その以前の値を返す (関数) | |
| (C++11)(C++11) |
フラグの値をアトミックに false に設定する (関数) |
| (C++20)(C++20) |
フラグの値をアトミックに返す (関数) |
| (C++20)(C++20) |
通知され、かつフラグが変更されるまでスレッドをブロックする (関数) |
| (C++20) |
atomic_flag_waitでブロックされているスレッドに通知する (関数) |
| (C++20) |
atomic_flag_waitでブロックされている全てのスレッドに通知する (関数) |
初期化 | |
| (C++11)(C++20で非推奨) |
デフォルトコンストラクトされたアトミックオブジェクトの非アトミックな初期化 (関数テンプレート) |
| (C++11)(C++20で非推奨) |
静的記憶域期間を持つアトミック変数の定数初期化 (関数マクロ) |
| (C++11) |
std::atomic_flag を false に初期化する (マクロ定数) |
メモリ同期順序 | |
| (C++11) |
与えられたアトミック操作に対するメモリ順序制約を定義する (enum) |
| (C++11)(C++26で非推奨) |
std::memory_order_consume 依存関係ツリーから指定されたオブジェクトを削除する (関数テンプレート) |
| (C++11) |
汎用的なメモリ順序依存のフェンス同期プリミティブ (関数) |
| (C++11) |
スレッドと、同じスレッドで実行されるシグナルハンドラとの間のフェンス (関数) |
| ヘッダ
<stdatomic.h> で定義 | |
C互換マクロ (C++23以降) | |
| (C++23) |
_Atomic(T) が std::atomic<T> と同一になるような互換マクロ (関数マクロ) |
_Atomic マクロも、グローバル名前空間の非マクロ宣言も、<stdatomic.h> 以外のどのC++標準ライブラリヘッダからも提供されません。
[編集] 相互排他
相互排他アルゴリズムは、複数のスレッドが共有リソースに同時にアクセスすることを防ぎます。これによりデータ競合を防ぎ、スレッド間の同期をサポートします。
| ヘッダ
<mutex> で定義 | |
| (C++11) |
基本的な相互排他機能を提供する (クラス) |
| (C++11) |
タイムアウト付きのロックを実装した相互排他機能を提供する (クラス) |
| (C++11) |
同じスレッドによって再帰的にロックできる相互排他機能を提供する (クラス) |
| (C++11) |
再帰的にロックできる相互排他機能を提供する 同じスレッドによって、タイムアウト付きのロックを実装 (クラス) |
| ヘッダ
<shared_mutex> で定義 | |
| (C++17) |
共有相互排他機能を提供する (クラス) |
| (C++14) |
共有相互排他機能を提供し、タイムアウト付きのロックを実装する (クラス) |
汎用ミューテックス管理 | |
| ヘッダ
<mutex> で定義 | |
| (C++11) |
厳密なスコープベースのミューテックス所有権ラッパーを実装する (クラステンプレート) |
| (C++17) |
デッドロックを回避する、複数のミューテックス用のRAIIラッパー (クラステンプレート) |
| (C++11) |
ムーブ可能なミューテックス所有権ラッパーを実装する (クラステンプレート) |
| (C++14) |
ムーブ可能な共有ミューテックス所有権ラッパーを実装する (クラステンプレート) |
| ロック戦略を指定するために使用されるタグ (タグ) | |
汎用ロックアルゴリズム | |
| (C++11) |
try_lockの繰り返し呼び出しによってミューテックスの所有権を取得しようと試みる(関数テンプレート) |
| (C++11) |
指定されたミューテックスをロックし、いずれかが利用できない場合はブロックする (関数テンプレート) |
Call once | |
| (C++11) |
call_once が関数を一度だけ呼び出すことを保証するためのヘルパーオブジェクト (クラス) |
| (C++11) |
複数のスレッドから呼ばれた場合でも、関数を一度だけ呼び出す (関数テンプレート) |
[編集] 条件変数
条件変数は、複数のスレッドが互いに通信することを可能にする同期プリミティブです。これにより、いくつかのスレッドが、他のスレッドからの進行許可の通知を待機する(タイムアウト付きの場合もある)ことができます。条件変数は常にミューテックスと関連付けられます。
| ヘッダ
<condition_variable> で定義 | |
| (C++11) |
std::unique_lock と関連付けられた条件変数を提供する (クラス) |
| (C++11) |
任意のロック型と関連付けられた条件変数を提供する (クラス) |
| (C++11) |
このスレッドが完全に終了したときに notify_all が呼び出されるようにスケジュールする(関数) |
| (C++11) |
条件変数でのタイムアウト付き待機の結果として考えられるものをリストする (enum) |
[編集] セマフォ (C++20以降)
セマフォは、共有リソースへの同時アクセスを制限するために使用される軽量な同期プリミティブです。どちらでも十分な場合、セマフォは条件変数よりも効率的になることがあります。
| ヘッダ
<semaphore> で定義 | |
| (C++20) |
非負のリソースカウントをモデル化するセマフォ (クラステンプレート) |
| (C++20) |
2つの状態しか持たないセマフォ (typedef) |
[編集] ラッチとバリア (C++20以降)
ラッチとバリアは、任意の数のスレッドが、期待される数のスレッドが到着するまでブロックできるようにするスレッド調整メカニズムです。ラッチは再利用できませんが、バリアは繰り返し使用できます。
| ヘッダ
<latch> で定義 | |
| (C++20) |
一度だけ使用可能なスレッドバリア (クラス) |
| ヘッダ
<barrier> で定義 | |
| (C++20) |
再利用可能なスレッドバリア (class template) |
[編集] Future
標準ライブラリは、非同期タスク(つまり、別のスレッドで起動された関数)によって返される値を取得し、スローされる例外をキャッチするための機能を提供します。これらの値は共有状態で通信されます。非同期タスクは共有状態に戻り値を書き込むか、例外を格納することができ、その共有状態を参照する std::future または std::shared_future のインスタンスを持つ他のスレッドが、その状態を検査、待機、その他の操作を行うことができます。
| ヘッダ
<future> で定義 | |
| (C++11) |
非同期に取得するための値を格納する (クラステンプレート) |
| (C++11) |
関数の戻り値を非同期に取得するためにパッケージ化する (クラステンプレート) |
| (C++11) |
非同期に設定される値を待機する (クラステンプレート) |
| (C++11) |
非同期に設定される値(他のfutureから参照される可能性あり)を待機する (クラステンプレート) |
| (C++11) |
関数を非同期に(場合によっては新しいスレッドで)実行し、結果を保持する std::future を返す (関数テンプレート) |
| (C++11) |
std::async の起動ポリシーを指定する (enum) |
| (C++11) |
std::future と std::shared_future で実行されるタイムアウト付き待機の結果を指定する (enum) |
Futureエラー | |
| (C++11) |
futureやpromiseに関連するエラーを報告する (クラス) |
| (C++11) |
futureエラーカテゴリを識別する (関数) |
| (C++11) |
futureエラーコードを識別する (enum) |
[編集] 安全な再利用 (C++26以降)
安全な再利用技術は、アクセスと削除の競合を直接的に解決するために最も頻繁に使用されます。
Read-Copy-Update (RCU) 機構 | |
| ヘッダ
<rcu> で定義 | |
| (C++26) |
オブジェクトがRCUによって保護されることを許可する (クラステンプレート) |
| (C++26) |
RCU保護の領域を提供する (クラス) |
| (C++26) |
std::rcu_domain 型の静的記憶域期間を持つオブジェクトへの参照を返す(関数) |
| (C++26) |
RCUドメイン上で保護領域がアンロックされるまでブロックする (関数) |
| (C++26) |
RCUドメイン上でスケジュールされた操作を評価し、先行するすべての評価が完了するまでブロックすることがある (関数) |
| (C++26) |
指定された関数の評価をRCUドメイン上でスケジュールし、メモリを割り当てる可能性があり、スケジュールされた評価を呼び出す (関数テンプレート) |
ハザードポインタ | |
| ヘッダ
<hazard_pointer> で定義 | |
| (C++26) |
オブジェクトがハザード保護可能であることを許可する (クラステンプレート) |
| (C++26) |
ある時点で最大1つのスレッドによって所有されることができる、単一ライター・複数リーダーのポインタ (クラス) |
| (C++26) |
ハザードポインタを構築する (関数) |
[編集] 関連項目
| C言語ドキュメントの並行性サポートライブラリ
|