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

我在做我的编码项目类似的东西,想知道是否因为线程都在循环中定义它们在循环结束后销毁后(我摧毁知道线程指针可能会被删除,但线程本身呢?)。C++ - 是这些线程的for循环完成

+1

通常当你使用新的,你分配内存,你需要使用删除来删除它或内存区域将保持分配,直到程序结束 –

+3

@TemaniAfif你可能是指'删除'。 – Ron

+1

@Ron yes!免费与malloc,只是一个错误... –

回答

4

不,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矢量超出范围时,它会删除它里面std::unique_ptr<thread>对象,这反过来又呼吁各std::thread对象delete

+1

@ user3572917是的,因为你不立即等待你刚刚开始的线程。你创建它们,然后开始等待每一个。 – luk32

+0

'make_unique'里面不需要'new'(并不是说整个动态分配是不必要的) – Slava

+0

@Slava你说得对,他们将参数转发给实际的'new'。谢谢!啊,你在这个例子中没有必要进行动态分配是正确的。 – dasblinkenlight

0

这里

thread *t = new thread(example_function); 

你已经失去了以前分配thread实例,并有内存泄漏。

join()不释放分配的内存,但拾取异步结束的函数。

2

我在做我的编码项目类似的东西,如果因为线程得到他们在循环后销毁内循环定义结束使用运营商new动态分配的

整个目的是想知道是提供手动控制对象的生命周期。因此,不,直到你明确地调用delete或者你使用了一个智能指针,它在你的引擎盖下,你的对象不会被销毁。请注意,在循环内部有效地调用std::thread::join()会使您的程序单线程化。更正确的使用将是:new

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 
+0

我在想同样的事情,除了把代码放在'{}'中做一个并发执行的范围。 – luk32

0

号调用者有责任确保使用分配对象是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是具有运算符重载表现很像与删除东西的差别的指针指向一个对象(如果有的话)在其寿命时结束。