for (int i = 0; i < 10; i++) {
thread *t = new thread(example_function);
t->join();
}
我在我的一个编码项目中正在做类似的事情,并且想知道自从线程在循环内定义后,它们是否在循环结束后被销毁(我知道指向线程的指针可能会被删除,但线程本身呢? ?)。
最佳答案
不,thread
在 for
中创建的对象循环不会被破坏,这意味着它们会造成内存泄漏。
为了确保线程被销毁,您需要调用 delete
通过以下几种方式之一:
- 调用
delete
在范围的末尾,或者 - 将线程指针添加到指针容器中,并调用
delete
在一个单独的循环中,或者 - 将线程指针添加到智能指针,以确保在范围结束时删除,或者
- 将线程指针添加到智能指针的容器中,并让容器在超出范围时删除线程。
请注意,由于您正在调用 join
在每次循环迭代中,您的“并发”程序与单线程程序一样好。以下是如何并发运行您的线程,并确保在最后删除线程:
std::vector<std::unique_ptr<std::thread>>> threads;
for (int i = 0; i < 10; i++) {
threads.push_back(std::make_unique<thread>(example_function));
}
for (int i = 0; i < 10; i++) {
threads[i]->join();
}
一次threads
vector 超出范围,它删除 std::unique_ptr<thread>
它里面的对象,它又调用delete
关于个人std::thread
对象。
关于C++ - 这些线程是否在 for 循环完成后被销毁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46812308/