3
我想了解異步行爲並編寫了一些愚蠢的測試程序。std :: async和std ::將來的行爲
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;
}
輸出:
2: hello3: hello
46: hello
: hello5: hello
9: hello
10: hello
11: hello
最後,試圖對返回的未來使用get()仍給出了類似的錯位輸出:
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
我會想到在在第一種情況下,main將不等待在後臺運行的線程而退出。至少在第三種情況下,main會阻止future.get()。
引擎蓋下究竟發生了什麼?
其實並不是在異步完成之前退出。 ;) – Yakk