2017-07-13 16 views
3

VS2015の下のコードでは、最初の行にacefbdが表示されていますが、これは正しいです。私が個々の行に分けている2番目のテストでは、出力はabcdefです。VS2015 std :: async strange

これは意図した動作ですか?

#include <future> 
#include <iostream> 

using namespace std; 

void a() { 
std::cout << "a"; 
std::this_thread::sleep_for (std::chrono::seconds (3)); 
std::cout << "b"; 
} 

void c() { 
std::cout << "c"; 
std::this_thread::sleep_for (std::chrono::seconds (4)); 
std::cout << "d"; 
} 

void e() { 
std::cout << "e"; 
std::this_thread::sleep_for (std::chrono::seconds (2)); 
std::cout << "f"; 
} 

int main() 
{ 
    std::async (std::launch::async, a), std::async (std::launch::async, c), std::async (std::launch::async, e); 

cout << "\n2nd Test" << endl; 

std::async (std::launch::async, a); 
std::async (std::launch::async, c); 
std::async (std::launch::async, e); 

} 

答えて

7

これは、Visual Studioとは何の関係もありませんが、あなたはそのstd::async戻りstd::futureオブジェクトでやっています。

std::futureオブジェクトが破棄されると、将来の準備ができるまで待つ間にthe destructorブロックが破棄されます。

最初の行では、3つの将来のオブジェクトを作成し、完全な式の最後に(最後のものを作成した後)、先物は範囲外になり破棄されます。

「2番目のテスト」では、継続する前に破壊する必要がある未来を作成し、次に続行する前に破壊する必要がある別の未来を作成し、最後に3次未来も破壊する必要があります。

あなたは一時変数での第二の試験で先物を保存場合は、同じ動作を取得する必要がありますあなたは一時が破壊されている順序は

auto temp_a = std::async (std::launch::async, a); 
auto temp_c = std::async (std::launch::async, c); 
auto temp_e = std::async (std::launch::async, e); 
+0

知っていますか?それは実装定義ですか? – Rakete1111

+0

@ Rakete1111コンマ式を使った最初のテストを意味すると思いますか?それで、仕様を見ていなくても、わかりません。 –

+2

@ Rakete1111一時的なものは、同じ完全表現内の構造の逆の順序で破棄されます。参照にバインドされているために寿命が延長されているものを除きます。 (これらはそうではありません)。 –

関連する問題