2016-05-22 5 views
3

私は非同期の動作を理解しようとしており、いくつかの愚かなテストプログラムを書いています。std :: asyncとstd :: futureの動作

int f(int i) 
    { 
     std::cout << i << ": hello" << std::endl; 
     int j = 0; 
     while (j < 10000) //just add some delay 
     { 
      j++; 
     } 
     return j; 
    } 

int main() 
{ 
    for (int i = 0; i < 10000; i++) 
    { 
     std::async(std::launch::async, f, i); 
    } 
    std::cout << "in main" << std::endl; 
} 

上記のコードでは、出力は完全に同期しているようです。すべての10000スレッドが順番に実行されているようです。メインスレッドはブロックします。

0: hello 
1: hello 
2: hello 
....... 
10000: hello 
in main 

しかし、将来的にはベクトルに格納されて返されたときに、出力が生成されたスレッドを待たずに、すべてのマングルされ、メイン終了しています。スレッドはここで切り離されていますか?

int main() 
{ 
    std::vector<std::future<int>> v; 

    for (int i = 0; i < 10000; i++) 
    { 
     v.push_back(std::move(std::async(std::launch::async, f, i))); 
    } 

    std::cout << "in main" << std::endl; 
} 

出力:

int main() 
{ 
    std::vector<std::future<int>> v; 

    for (int i = 0; i < 10000; i++) 
    { 
     v.push_back(std::move(std::async(std::launch::async, f, i))); 
    } 

    for (int i = 0; i < 10000; i++) 
    { 
     std::cout << v[i].get();  
    } 

    std::cout << "in main" << std::endl; 
} 

出力:

3: hello 
4: hello 
1: hello 
5: hello 
0: hello 
2: hello 

2: hello3: hello 

46: hello 
: hello5: hello 
9: hello 
10: hello 
11: hello 

最後に、返された未来に()を取得使用しようとすると、やはり同様のマングルされた出力を提供します

最初のケースでは、バックグラウンドで実行されているスレッドを待たずにメインが終了します。少なくとも3番目のシナリオでは、メインはfuture.get()をブロックします。

正確に何がフードの下で起こっていますか?

+0

メインは、非同期の終了前に実際に終了しません。 ;) – Yakk

答えて

3

asyncによって返される先物は、.wait()を暗示的にdtorにしますが、この動作はmoveになります。

あなたの症状をすべて説明します。

関連する問題