2012-02-28 13 views
13

私はlamba fooを持っています。何も返さず、何も返す必要はありません。私はこれを行うと は:返り値が格納されていないと、std :: asyncは新しいスレッドを生成しません

std::future<T> handle = std::async(std::launch::async, foo, arg1, arg2); 

すべてが正常に動作し、ラムダは新しいスレッドで生み出されます。 しかし、std::asyncが返すstd::futureを保存しないと、fooはメインスレッドで実行され、ブロックされます。

std::async(std::launch::async, foo, arg1, arg2); 

私はここで何が欠けていますか? just::threaddocumentationから

+5

おそらく '' 'async'''によって返される' '' future'''はすぐに破棄されます。 '' '' 'のデストラクタが暗黙のうちに暗黙のうちに待機しているのであれば、私は驚かないだろう。 –

答えて

16

ポリシーがstd::launch::asyncであれば、独自のスレッド上でINVOKE(fff,xyz...)を実行します。返されたstd::futureは、このスレッドが完了すると準備完了になり、関数呼び出しによってスローされた戻り値または例外を保持します。返されたstd::futureの非同期状態に関連付けられた最後の未来オブジェクトのデストラクタは、未来が準備できるまでブロックされる。

std::async(std::launch::async, foo, arg1, arg2); 

で返さ将来は fooが終了するまで、どこでも、そのデストラクタブロック割り当てられていません。

4

Herb Sutterの記事へのリンクをasync and ~futureに追加したいと思います。先物は決してブロックしてはならないと主張しています。

+0

これは記事ではなく、プロポーザルです。それ以外に、 '〜future()'ブロックを作ることは間違いでした。 – Xeo

+2

〜future()はデフォルトで実際にはブロックされません。これは、asyncが未来にブロッキング状態を割り当て、〜future()がそれを解放しなければならないので、std :: asyncから返されたときだけブロックします。 –

0

なぜブロックしますか?

  1. std::async();戻りstd::future一時オブジェクト
  2. 一時オブジェクトはdesctructorを呼び出し、すぐに破壊されます。
  3. std::futureデストラクタがブロックしています。それは悪くて面倒です。

なぜ割り当てが問題なのですか?

変数に代入することによって、返されたオブジェクトはすぐに破棄されるのではなく、呼び出しコードのスコープの終わりまで破棄されます。

コード例:main1はokです。 main2main3は、等価的にメインスレッドをブロックしています。

void forever() { 
    while (true); 
} 

void main1() { 
    std::future<void> p = std::async(std::launch::async, forever); 
    std::cout << "printing" << std::endl; // can print, then forever blocking 
} 

void main2() { 
    std::async(std::launch::async, forever); 
    std::cout << "printing" << std::endl; // forever blocking first, cannot print 
} 

void main3() { 
    {std::future<void> p = std::async(std::launch::async, forever);} 
    std::cout << "printing" << std::endl; // forever blocking first, cannot print 
} 

場合でも、打ち上げ::非同期が選択されている場合 は、将来を作成したスレッドの 最後にリンクされて返さ非同期STDのcplusplus.com

戻り値::を見てみましょうその共有状態は決してアクセスされません: この場合、そのデストラクタはfnの戻り値と同期します。 したがって、fnがvoidを返した場合でも、非同期の動作の場合、戻り値は無視されません。

関連する問題