C++ - 这些线程是否在 for 循环完成后被销毁

标签 c++ multithreading concurrency

for (int i = 0; i < 10; i++) {
    thread *t = new thread(example_function);
    t->join();
}

我在我的一个编码项目中正在做类似的事情,并且想知道自从线程在循环内定义后,它们是否在循环结束后被销毁(我知道指向线程的指针可能会被删除,但线程本身呢? ?)。

最佳答案

不,threadfor 中创建的对象循环不会被破坏,这意味着它们会造成内存泄漏。

为了确保线程被销毁,您需要调用 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/

相关文章:

c++ - 从 Getline 解析空格分隔的数字

c++ - C++中什么时候使用const_cast

c++ - 如何在 VSCODE 中使用 OpenCV C++

java - java多线程Web服务中同步和维护操作顺序

java - 静态和动态调度的优点和缺点

c++ - 无法在 Mac 上访问 std vector 迭代器 _Ptr

java - 保证线程执行顺序是先到先得

Java线程级沙箱

java - 使用 Spring 创建线程

java - 在java中使用多线程时性能降低