future
との違いは何ですかshared_future
?の代わりに
を使用する必要があるのはどのような場合ですか?shared_future
future
私は C++11 のこれら 2 つの機能を対比する優れたドキュメントを探していましたが、Web 上で答え (少なくとも簡単で読みやすいもの) を見つけることができませんでした。
これが私が現在理解している違いです
future
オブジェクトは に対して 1 回だけ照会できますget()
。shared_future
何度でも問い合わせることができます。
使用例: 複数のスレッドが非同期タスクの結果に依存している場合は、 を使用する必要がありますshared_future
。future オブジェクトを同じスレッドで複数回照会する必要がある場合は、代わりに を使用する必要がありますshared_future
。
さらに詳しい情報、注意点、一般的なガイドラインがあれば、ぜひお知らせください。
ベストアンサー1
これら 2 つの future 型の目的は、移動セマンティクス、移動専用型、および通常の関数から移動専用型を返す新しい C++11 機能に遡ります。
C++98/03 では、ファクトリ関数から型を返す場合:
A
make_A()
{
A a;
// ...
return a;
}
でA
あれば である必要がありましたCopyConstructible
。そして、C++11 の新機能として、A
でない場合でもを返すことができCopyConstructible
、 であればよいのですMoveConstructible
。
しかし、たとえば futures を使用して並行実行しようとするとどうなるでしょうか。の場合にmake_A
のみ並列化できるとしたら、それは犯罪ではないでしょうか。 1 つの最適化を諦めて、別の最適化を追い求めなければなりません。make_A
A
CopyConstructible
したがって、のみがfuture<R>
必要です。ただし、保存された結果から移動しているため、これを取得できるのは 1 回だけです。R
MoveConstructible
しかし、複数のスレッドで同じ結果を得ることも本当に必要です。 ではshared_future<R>
それが可能になりますが、 が必要R
になりますCopyConstructible
。