【发布时间】:2017-09-13 01:16:37
【问题描述】:
std::vector<std::thread> threadList;
然后我创建一个线程并将其推送到vector。
threadList.push_back(std::thread([]() { ... }));
当lambda function 完成执行时,如何从threadList vector 中删除thread?
编辑
我想出了一些解决方案;在线程lambda function 返回之前,它会遍历vector 以在ID 中与this_thread::get_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 可以在退出之前从向量中删除
std::thread(这意味着保护vector免受并发访问,例如使用std::mutex)。或者,您可以让 lambda 以某种方式向拥有vector的线程发出信号,并让该线程在有时间时删除std::thread。或者,您可以简单地拥有拥有线程(或另一个监控线程)join()std::thread,并在完成时将其删除。 -
join()首先线程,然后以完全相同的方式将其从向量中删除,100% 相同的方式您将从任何其他向量中删除某些内容。向量在添加或删除值方面没有任何不同,只是因为它包含std::threads。 -
std::vector::erase()
-
我已经更新了我的帖子
-
您对
push_back(在“编辑”部分)所做的操作无效;在多个线程中修改一个对象。第一条评论已经提到了
标签: c++ multithreading vector lambda