for (auto iter : m_vecThread) { if(iter->joinable()) iter->join(); delete iter; } m_vecThread.clear(); 是否存在问题
时间: 2024-03-08 11:49:16 浏览: 111
这段代码也是在删除线程池中的所有线程,但是也存在一个问题。在遍历容器的过程中,如果删除了一个元素,则会导致迭代器失效,进而导致未定义行为或者程序崩溃。因此,这段代码也需要进行改进。
一种改进方式是,使用一个 while 循环来重复删除线程池中的元素,直到容器为空。具体做法如下:
```
while (!m_vecThread.empty()) {
auto iter = m_vecThread.begin();
if ((*iter)->joinable()) {
(*iter)->join();
}
delete *iter;
m_vecThread.erase(iter);
}
```
这里使用 while 循环来重复删除容器中的元素,直到容器为空。在循环中,首先获取容器的头部元素的迭代器,然后判断这个元素是否可加入。如果是,则加入该线程,并且从线程池中删除该线程。这种做法可以避免迭代器失效的问题,同时也能够正确地删除线程池中的所有线程。
另外,这段代码中还需要添加一个 join_all() 方法,用于等待所有线程执行完毕。具体做法如下:
```
void join_all() {
for (auto& thread : m_vecThread) {
if (thread->joinable()) {
thread->join();
}
}
}
```
这里使用 for 循环遍历线程池中的所有线程,然后判断每个线程是否可加入。如果是,则等待该线程执行完毕。这个方法可以确保所有线程都执行完毕后再退出程序,避免了线程的提前退出导致的未定义行为。
阅读全文