次の方法で共有


<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> オブジェクトを返し、その関連付けられた非同期状態は、結果、dfndargs の値、実行の個別のスレッドを管理するためのスレッド オブジェクトを保持します。

decay<Fn>::type が launch 以外の型でない限り、2 番目の関数はオーバーロードの解決に関与しません。

C++ 標準では、ポリシーが launch:: async の場合、関数は新しいスレッドを作成します。 ただし、Microsoft の実装は現在、準拠していません。 Windows ThreadPool からスレッドを取得します。この場合、新しいスレッドではなくリサイクルされたスレッドが提供される場合があります。 これは、launch::async ポリシーが launch::async|launch::deferred として実装されていることを意味します。 ThreadPool ベースの実装のもう 1 つの意味は、スレッドが完了したときにスレッドローカル変数が破棄されるという保証がないことです。 スレッドがリサイクルされ、async への新しい呼び出しに渡された場合、前の変数は引き続き存在します。 async でスレッドローカル変数を使用しないことをお勧めします。

policylaunch::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 オブジェクト。

関連項目

<future>