gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 00:44:48 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com