2013-04-14 9 views
26

futureshared_futureの違いは何ですか?
futureの代わりにshared_futureを使用する必要がありますか?futureとshared_futureの違いは何ですか?

私はC++ 11のこれらの2つの機能を対照する良い文書を見つけようとしていましたが、Web上で答えを見つけられませんでした。

これは

  1. futureオブジェクトは一度だけget()のために照会することができ違いの私の現在の理解です。
  2. shared_futureは何回でも照会できます。

ユースケース:複数のスレッドが非同期タスクの結果に依存している場合 は、その後、我々はshared_futureを使用する必要があります。 将来のオブジェクトを同じスレッドで複数回クエリする必要がある場合は、代わりにshared_futureを使用する必要があります。

どれ詳細は、落とし穴や一般的なガイドラインは、これら二つの将来のタイプの動機は、セマンティクスを移動するタイプ、および移動を返すための新しいC++ 11の機能のみを移動するために戻って

答えて

30

...歓迎されています一般的な関数からのみです。 C++ 98/03で

、あなたはファクトリ関数から型を返すしたい場合:その後、

A 
make_A() 
{ 
    A a; 
    // ... 
    return a; 
} 

ACopyConstructibleでなければなりませんでした。そして、C++ 11の新機能では、CopyConstructibleでなくてもAを返すことができます。MoveConstructibleである必要があります。

しかし、先物を使ってmake_Aを同時に実行しようとするとどうなりますか? ACopyConstructibleの場合、make_Aだけをパラレル化できるのであれば、犯罪ではないでしょうか!あなたは別のものを追いかけながら1つの最適化をあきらめなければならないでしょう!

従ってfuture<R>RMoveConstructibleであることが必要です。しかし、保存した結果から移動しているため、一度しか取得できません。

しかし、複数のスレッドで同じ結果を得ることも本当に必要です。だからshared_future<R>が可能ですが、RCopyConstructibleである必要があります。

+4

shared_future のRはcopyConstructibleでなければならないだけでなく、実際にコピーされます。将来はとしてアクセスはコピーを作成せず、移動することはありません。 これは、デフォルトではの方が早いので、もっと早く使用することを意味し、そうする必要があるときはshared_future を使用してください。正しい? –

+3

@Ajeet:これは、実際には、 'future'と' shared_future'の命名を思いついた正確な推論です。最初は 'unique_future'と' shared_future'があり、どちらが "デフォルト"であるべきかについて多くの議論がありました。どちらがデフォルトになっていても、 "将来"という名前にする必要があります。この決定がなされた時点で、移動セマンティクスはまだC++委員会にとっては非常に新しく、よく理解されていませんでした。私は、C++委員会に「未来」のより簡単な名前を「unique_future」に割り当てるという信念の賢明な飛躍を信じています。 –

関連する問題