我在我的C++程序中有vector
的thread
s。在線程完成時從線程移除線程
std::vector<std::thread> threadList;
然後我創建一個線程並將其推入vector
。
threadList.push_back(std::thread([]() { ... }));
我如何刪除從threadList
vector
當lambda function執行完畢的thread
?
編輯
我拿出幾分的解決方案;在線程lambda function返回之前,它會遍歷vector
以找到與this_thread::get_id()
的ID匹配。
通過Visual Studio逐行調試,我發現它在ID中找到匹配,並且執行了erase函數,但只要threadList.erase(threadList.begin() + index);
被執行,我就會在線程的解構函數中處理未處理的異常。
我寫了一小段代碼來複制這個錯誤。
vector<thread> threadList;
threadList.push_back(thread([]() {
Sleep(1000);
threadList.erase(threadList.begin());
}));
Sleep(2000);
//for_each(threadList.begin(), threadList.end(), mem_fn(&thread::detach));
//threadList.clear();
此代碼導致下面的屏幕截圖。
在退出之前,lambda可以從vector中移除'std :: thread'(這意味着在併發訪問中保護'vector',例如使用'std :: mutex')。或者,您可以讓lambda信號以某種方式擁有'vector'的線程,並且在有時間的時候讓該線程移除'std :: thread'。或者,您可以擁有自己的線程(或另一個監視線程),只需'join()'std :: thread'並在完成時將其刪除。 –
'首先加入()'線程,然後以完全相同的方式從矢量中刪除它,您將從其他矢量中刪除某些東西。就添加或刪除值而言,矢量的行爲不同,只是因爲它包含'std :: thread's。 –
std :: vector :: erase() – Les