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()をブロックします。
正確に何がフードの下で起こっていますか?
メインは、非同期の終了前に実際に終了しません。 ;) – Yakk