2016-05-22 75 views
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()。

引擎蓋下究竟發生了什麼?

+0

其實並不是在異步完成之前退出。 ;) – Yakk

回答

3

由異步返回的期貨在他們的dtor中隱含地做了.wait(),但是:這種行爲可以是move ed。

這解釋了所有的症狀。

相關問題