<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);
パラメーター
ポリシー
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) に制限されています。 現在、ハードウェアで同時に実行されるスレッドの数は、プロセスのプロセッサ グループ内の論理プロセッサの数によって制限されているため、64 に実質的に制限されています。「プロセッサ グループ」を参照してください。
future_category
future
オブジェクトに関連するエラーの特性を設定する error_category オブジェクトへの参照を返します。
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
future エラーを特徴付ける error_category オブジェクトと共に、error_condition を作成します。
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
オブジェクト。
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示