<future>
関数
async
future_category
make_error_code
make_error_condition
swap
|
async
非同期プロバイダーを表します。
template <class Fn, class... ArgTypes>
future<typename result_of<Fn(ArgTypes...)>::type>
async(Fn&& fn, ArgTypes&&... args);
template <class Fn, class... ArgTypes>
future<typename result_of<Fn(ArgTypes...)>::type>
async(launch policy, Fn&& fn, ArgTypes&&... args);
パラメーター
policy
launch
値。
解説
省略形の定義:
省略形 | 説明 |
---|---|
dfn |
decay_copy(forward<Fn>(fn)) の呼び出しの結果。 |
dargs |
decay_copy(forward<ArgsTypes>(args...)) の呼び出しの結果。 |
Ty |
result_of<Fn(ArgTypes...)>::type 型です。 |
1 番目のテンプレート関数は、async(launch::any, fn, args...)
を返します。
2 番目の関数は future<Ty>
オブジェクトを返し、その関連付けられた非同期状態は、結果、dfn
と dargs
の値、実行の個別のスレッドを管理するためのスレッド オブジェクトを保持します。
decay<Fn>::type
が launch 以外の型でない限り、2 番目の関数はオーバーロードの解決に関与しません。
C++ 標準では、ポリシーが launch::async
されている場合、関数は新しいスレッドで呼び出し可能なオブジェクトを呼び出すかのように動作すると述べています。 つまり、通常は新しいスレッドを作成しますが、実装では他のメカニズムを使用して同等の動作を実現できます。 ただし、現在、Microsoft の実装はこの動作に厳密には準拠していません。 Windows ThreadPool からスレッドを取得します。これは、新しいスレッドではなくリサイクルされたスレッドを提供する可能性があります。 つまり、 launch::async
ポリシーは launch::async|launch::deferred
として効果的に実装されます。 ThreadPool ベースの実装のもう 1 つの意味は、スレッドが完了したときにスレッド ローカル変数が破棄される保証がないということです。 スレッドがリサイクルされ、 async
の新しい呼び出しに提供された場合、古い変数は引き続き存在します。 async
でスレッド ローカル変数を使用しないことをお勧めします。
policy
が launch::deferred
である場合、関数は関連付けられた非同期状態を遅延関数の保持中としてマークして戻ります。 関連付けられた非同期状態が有効になるのを待機する時間外の関数の最初の呼び出しは、 INVOKE(dfn, dargs..., Ty)
を評価することによって遅延関数を呼び出します。
いずれの場合も、future
オブジェクトの関連付けられた非同期状態は、INVOKE(dfn, dargs..., Ty)
の評価が完了するまでは、例外がスローされても正常に制御が戻っても、ready には設定されません。 関連付けられた非同期状態の結果は、スローされた場合、または評価が返す値の例外です。
Note
std::async
で開始されたタスクにアタッチされた future
(または最後の shared_future
) の場合、タスクが完了していないと、デストラクターがブロックします。つまり、スレッドがまだ .get()
または .wait()
を呼び出しておらず、タスクがまだ実行中の場合、デストラクターによってブロックされます。 future
から取得された std::async
がローカル スコープ外に移動される場合、それを使う他のコードでは、共有状態が準備完了になることをデストラクターがブロックする場合があることに注意する必要があります。
擬似関数 INVOKE
は <functional>
で定義されています。
Microsoft 固有の仕様
渡された関数は、非同期的に実行されると、Windows スレッド プールで実行されます。 詳細については、「 スレッド プール」を参照してください。 同時実行スレッドの数は、スレッド プールの既定値 (500 スレッド) に制限されます。
Windows 11 および Windows Server 2022 より前では、アプリケーションは既定で最大 64 個の論理プロセッサを持つ 1 つのプロセッサ グループに制限されていました。 これにより、同時に実行されるスレッドの数が 64 に制限されます。 詳細については、「 Processor グループ」を参照してください。
Windows 11 および Windows Server 2022 以降では、プロセスとそのスレッドにはプロセッサ アフィニティがあり、既定では、システム内のすべてのプロセッサと、64 を超えるプロセッサを持つマシン上の複数のグループにまたがっています。 同時実行スレッドの数の制限は、システム内の論理プロセッサの合計数になりました。
future_category
error_category
オブジェクトに関連するエラーの特性を設定する future
オブジェクトへの参照を返します。
const error_category& future_category() noexcept;
make_error_code
future エラーを特徴付ける error_category オブジェクトと共に、error_code を作成します。
inline error_code make_error_code(future_errc Errno) noexcept;
パラメーター
Errno
報告されたエラーを識別する future_errc
値。
戻り値
error_code(static_cast<int>(Errno), future_category());
make_error_condition
エラーを特徴付error_category
オブジェクトと共にerror_condition
future
作成します。
inline error_condition make_error_condition(future_errc Errno) noexcept;
パラメーター
Errno
報告されたエラーを識別する future_errc
値。
戻り値
error_condition(static_cast<int>(Errno), future_category());
swap
関連付けられた非同期状態を、promise
オブジェクト間で交換します。
template <class Ty>
void swap(promise<Ty>& Left, promise<Ty>& Right) noexcept;
template <class Ty, class... ArgTypes>
void swap(packaged_task<Ty(ArgTypes...)>& Left, packaged_task<Ty(ArgTypes...)>& Right) noexcept;
パラメーター
Left
左側の promise
オブジェクト。
Right
右側の promise
オブジェクト。