我有一個多線程的應用程序,有一個循環等待用戶輸入作爲主線程。 在正確的輸入上,它應該停止循環並等待所有其他線程,以便正常結束。std ::列表<std::future>析構函數不會阻止
爲此,我創建了一個的std ::名單中,我把的std ::線程創建
std::list<std::future<int>> threads;
threads.emplace_front(std::async(std::launch::async, ...));
我的印象是創造未來對象,讓列表因爲列表的析構函數將破壞所有的 std :: future元素和the destructor of those將等待線程完成。
編輯:既然是相關的,我將其添加在這裏: 這是Win7上與MSVC版本的Visual Studio 2013專業版 /EDIT
當我嘗試這樣做,它沒有塊,我不得不添加
for (auto it = threads.begin(); it != threads.end(); ++it) {
it->get();
}
要結束的功能,要正確地阻止。
我誤解了一些東西,還是必須以不同的方式創建線程,才能做我想在這裏做的事情?
@ T.C.如果真的那麼簡單,我不應該依賴它們來阻止,你應該添加這個作爲答案,所以我可以接受它 – Ongy 2014-09-06 09:14:09
看起來像一個bug。什麼是編譯器? – ixSci 2014-09-06 09:14:57
嗯,斯科特·邁耶斯[提出一個很好的論點](http://scottmeyers.blogspot.com/2013/03/stdfutures-from-stdasync-arent-special.html)「std :: async'的規範要求它阻止。有趣的... – 2014-09-06 09:16:33