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

时间:2017-10-18 14:14:04

标签: c++ multithreading concurrency

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

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

4 个答案:

答案 0 :(得分:4)

不,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个对象,而这些对象又会在单个std::unique_ptr<thread>个对象上调用delete

答案 1 :(得分:2)

  

我在我的编码项目中做了类似的事情,并且想知道如果线程在循环内被定义,它们会在循环结束后被销毁

使用运算符new进行动态分配的全部目的是提供对对象生存期的手动控制。所以不,直到你明确地调用delete或者你使用一个智能指针为你做引导你的对象不会被破坏。注意,在循环内部有效调用std::thread::join()会使程序单线程化。更合适的用途是:

std::vector<std::thread> threads;
while( threads.size() < 10 )
    threads.emplace_back(example_function);

for( auto &thread : threads )
    thread.join(); // join in a separate loop, let all threads to start

threads.clear(); // or let it go out of scope

答案 2 :(得分:0)

这里

username:john & password: 123456

你已经松开了之前分配的thread *t = new thread(example_function); 实例并且有内存泄漏。

thread不释放已分配的内存,但会选择异步终止的函数。

答案 3 :(得分:0)

没有。调用者负责确保使用new分配的对象为delete d。

代码当然是毫无意义的,因为没有有意义的并发发生但是为了避免内存泄漏应该是:

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

在任何版本的C ++ 11之后,建议您在这些情况下使用std::unique_ptr

最推荐的形式是:

auto t{std::make_unique<std::thread>(example_function)};

这几乎相当于:

std::unique_ptr<std::thread> t(new std::thread(example_function));

std::unique_ptr是一个操作符重载的对象,其行为与指针很相似,不同之处在于它在生命周期结束时删除它所指向的东西(如果有的话)。