Concurrency support library (since C++11)
C++は、スレッド、アトミック操作、相互排他、条件変数、およびフューチャーの組み込みサポートを含みます。
目次 |
スレッド
スレッドにより、プログラムは複数のプロセッサコアで実行できるようになります。
|
ヘッダーで定義
<thread>
|
|
|
(C++11)
|
個別のスレッドを管理する
(クラス) |
|
(C++20)
|
std::thread
自動参加とキャンセル機能をサポート
(クラス) |
現在のスレッドを管理する関数 |
|
|
名前空間で定義
this_thread
|
|
|
(C++11)
|
実装に対してスレッドの実行再スケジュールを提案する
(関数) |
|
(C++11)
|
現在のスレッドのスレッドIDを返す
(関数) |
|
(C++11)
|
現在のスレッドの実行を指定された時間停止する
(関数) |
|
(C++11)
|
現在のスレッドの実行を指定された時点まで停止する
(関数) |
協調的キャンセレーション (C++20以降)
コンポーネント stop source 、 stop token 、および stop callback は、結果が不要になった場合などに、操作の実行を適時に停止するよう非同期で要求するために使用できます。このような要求は stop request と呼ばれます。
これらのコンポーネントは、 stop state への共有アクセスのセマンティクスを指定します。同じstop stateを参照するこれらのコンポーネントのいずれかをモデル化するオブジェクトは、それぞれ関連するstop source、stop token、またはstop callbackとなります。
|
コンセプト
|
(C++26以降) |
それらは以下のように設計されています:
- std::jthread のような実行の協調的キャンセルのため、
- std::condition_variable_any の待機関数を中断するため、
|
(C++26以降) |
- または、カスタム実行管理実装の場合。
実際、それらは何かを「停止」するために使用する必要すらなく、代わりにスレッドセーフなワンタイム関数呼び出しトリガーなどに使用することができます。
|
定義済みヘッダ
<stop_token>
|
|
Stopトークン型 |
|
|
(C++20)
|
std::jthread
のキャンセル要求が行われたかどうかを問い合わせるためのインターフェース
(クラス) |
|
(C++26)
|
停止が不可能かつ要求されないことを保証するstopトークンインターフェースを提供する
(クラス) |
|
(C++26)
|
関連付けられた
std::inplace_stop_source
オブジェクトの停止状態を参照するstopトークン
(クラス) |
Stopソース型 |
|
|
(C++20)
|
1つ以上の
std::jthread
を停止する要求を表すクラス
(クラス) |
|
(C++26)
|
停止状態の唯一の所有者である
stoppable-source
(クラス) |
Stopコールバック型 |
|
|
(C++20)
|
std::jthread
キャンセル時にコールバックを登録するためのインターフェース
(クラステンプレート) |
|
(C++26)
|
std::inplace_stop_token
用のstopコールバック
(クラステンプレート) |
|
(C++26)
|
指定されたstopトークン型に対するコールバック型を取得する
(エイリアステンプレート) |
コンセプト (C++20以降) |
|
|
(C++26)
|
停止要求の問い合わせと、停止要求が可能かどうかを許可するstopトークンの基本インターフェースを指定する
(コンセプト) |
|
(C++26)
|
停止を許可しないstopトークンを指定する
(コンセプト) |
|
(C++26)
|
型が関連付けられたstopトークンのファクトリであり、それに対して停止要求を行うことができることを指定する
( 説明専用コンセプト* ) |
|
(C++26)
|
指定されたstopトークン型でコールバックを登録するためのインターフェースを指定する
( 説明専用コンセプト* ) |
キャッシュサイズアクセス (since C++17)
|
定義済みヘッダー
<new>
|
|
|
偽共有を回避するための最小オフセット
真の共有を促進するための最大オフセット (定数) |
|
アトミック操作
これらのコンポーネントは、ロックフリー並行プログラミングを可能にする細粒度アトミック操作のために提供されています。各アトミック操作は、同じオブジェクトに関わる他のあらゆるアトミック操作に対して不可分です。アトミックオブジェクトは データ競合がない 。
|
定義済みヘッダー
<atomic>
|
|
アトミック型 |
|
|
(C++11)
|
bool型、整数型、
浮動小数点型、
(C++20以降)
およびポインタ型に対するatomicクラステンプレートと特殊化
(クラステンプレート) |
|
(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)
|
ロックフリーなブーリアンアトミック型
(クラス) |
|
(C++11)
(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)
(deprecated in C++20)
|
デフォルト構築されたアトミックオブジェクトの非アトミック初期化
(関数テンプレート) |
|
(C++11)
(deprecated in C++20)
|
静的ストレージ期間を持つアトミック変数の定数初期化
(関数マクロ) |
|
(C++11)
|
std::atomic_flag
を
false
に初期化する
(マクロ定数) |
メモリ同期順序 |
|
|
(C++11)
|
指定されたアトミック操作に対するメモリ順序制約を定義する
(enum) |
|
(C++11)
(deprecated in 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)
|
指定されたミューテックスをロックし、利用不可の場合はブロックする
(関数テンプレート) |
一度だけの呼び出し |
|
|
(C++11)
|
call_once
が関数を一度だけ呼び出すことを保証するヘルパーオブジェクト
(クラス) |
|
(C++11)
|
複数のスレッドから呼び出されても関数を一度だけ呼び出す
(関数テンプレート) |
条件変数
条件変数は、複数のスレッドが互いに通信することを可能にする同期プリミティブです。これは、いくつかのスレッドが他のスレッドからの通知を待機し(タイムアウトの可能性あり)、処理を進めることを可能にします。条件変数は常にミューテックスと関連付けられています。
|
ヘッダで定義
<condition_variable>
|
|
|
(C++11)
|
std::unique_lock
と関連付けられた条件変数を提供する
(クラス) |
|
(C++11)
|
任意のロック型と関連付けられた条件変数を提供する
(クラス) |
|
(C++11)
|
このスレッドが完全に終了したときに
notify_all
の呼び出しをスケジュールする
(関数) |
|
(C++11)
|
条件変数でのタイムドウェイトの可能な結果を列挙する
(列挙型) |
セマフォ (C++20以降)
セマフォは、共有リソースへの並行アクセスを制限するために使用される軽量な同期プリミティブです。どちらでも十分な場合、セマフォは条件変数よりも効率的であることがあります。
|
ヘッダーで定義
<semaphore>
|
|
|
(C++20)
|
非負のリソースカウントをモデル化するセマフォ
(クラステンプレート) |
|
(C++20)
|
2つの状態のみを持つセマフォ
(typedef) |
ラッチとバリア (C++20以降)
ラッチとバリアは、任意の数のスレッドが期待される数のスレッドが到着するまでブロックすることを可能にするスレッド調整メカニズムです。ラッチは再利用できませんが、バリアは繰り返し使用できます。
|
定義済みヘッダ
<latch>
|
|
|
(C++20)
|
単回使用スレッドバリア
(クラス) |
|
定義済みヘッダ
<barrier>
|
|
|
(C++20)
|
再利用可能スレッドバリア
(クラステンプレート) |
Futures
標準ライブラリは、非同期タスク(別スレッドで起動される関数)によって返される値の取得と、スローされる例外の捕捉を行う機能を提供します。これらの値は 共有状態 で伝達され、非同期タスクはその戻り値を書き込むか例外を格納することができ、その共有状態を参照する std::future または std::shared_future のインスタンスを保持する他のスレッドによって、検査、待機、その他の操作が可能です。
|
ヘッダーで定義
<future>
|
|
|
(C++11)
|
非同期取得のための値を格納する
(クラステンプレート) |
|
(C++11)
|
関数をパッケージ化し、その戻り値を非同期取得のために格納する
(クラステンプレート) |
|
(C++11)
|
非同期に設定される値を待機する
(クラステンプレート) |
|
(C++11)
|
非同期に設定される値(他のfutureから参照される可能性あり)を待機する
(クラステンプレート) |
|
(C++11)
|
関数を非同期で実行し(新しいスレッドで実行される可能性あり)、結果を保持する
std::future
を返す
(関数テンプレート) |
|
(C++11)
|
std::async
の起動ポリシーを指定する
(列挙型) |
|
(C++11)
|
std::future
および
std::shared_future
で実行されたタイムドウェイトの結果を指定する
(列挙型) |
Futureエラー |
|
|
(C++11)
|
futureまたはpromiseに関連するエラーを報告する
(クラス) |
|
(C++11)
|
futureエラーカテゴリを識別する
(関数) |
|
(C++11)
|
futureエラーコードを識別する
(列挙型) |
安全なリクレメーション (since C++26)
安全な領域再利用技術は、アクセス-削除競合を直接解決するために最も頻繁に使用されます。
Read-Copy-Update メカニズム |
|
|
ヘッダで定義
<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 documentation
for
Concurrency support library
|