2015-05-18 124 views
0

我踢了幾個異步任務,像這樣:等待多個異步任務來完成

for(UINT Id: myIds) 
{ 
    std::async([=] 
    { 
     DoSomeStuffUsingId(Id);    

     return true; 
    }); 
} 

我有需要知道所有這些任務已經完成了一個功能:

void SomeFunction() 
{ 
    if (all async tasks have completed) 
    { 
     do something else 
    } 
} 

我知道我可以在異步任務等待像這樣:

std::future<bool> fut = std::async (do something); 
fut.wait(); 

我從這個鏈接Waiting for multiple futures?噸看沒有多頭期貨等待。

是否有任何技巧可以用來查看我的所有任務是否已完成?

我可以將每個未來存儲在一個數組或向量中,然後依次等待每個未來嗎?

+0

你可以做的一件事是讓每個線程引用一個原子布爾值。任務完成後,可以將其設置爲true。然後你知道那個線程完成了。這允許您在沒有等待命令的情況下輪詢變量。 – NathanOliver

+0

您是否嘗試將每個未來存儲在數組或向量中並等待每個未來?聽起來像一個完全合理的模式使用。 – huu

+0

請注意,僅僅調用std :: async()不足以保證所有lambda表達式都作爲異步任務運行,您需要指定std :: launch :: async以確保這一點。請參閱http://en.cppreference.com/w/cpp/thread/async –

回答

0

您可以使用std :: shared_future(可以複製)或vector :: emplace_back()來放置std :: futures,但不能複製,但可以移動。