for (int i = 0; i < 10; i++) {
thread *t = new thread(example_function);
t->join();
}
我在做我的编码项目类似的东西,想知道是否因为线程都在循环中定义它们在循环结束后销毁后(我摧毁知道线程指针可能会被删除,但线程本身呢?)。C++ - 是这些线程的for循环完成
for (int i = 0; i < 10; i++) {
thread *t = new thread(example_function);
t->join();
}
我在做我的编码项目类似的东西,想知道是否因为线程都在循环中定义它们在循环结束后销毁后(我摧毁知道线程指针可能会被删除,但线程本身呢?)。C++ - 是这些线程的for循环完成
不,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>
对象,这反过来又呼吁各std::thread
对象delete
。
@ user3572917是的,因为你不立即等待你刚刚开始的线程。你创建它们,然后开始等待每一个。 – luk32
'make_unique'里面不需要'new'(并不是说整个动态分配是不必要的) – Slava
@Slava你说得对,他们将参数转发给实际的'new'。谢谢!啊,你在这个例子中没有必要进行动态分配是正确的。 – dasblinkenlight
这里
thread *t = new thread(example_function);
你已经失去了以前分配thread
实例,并有内存泄漏。
join()
不释放分配的内存,但拾取异步结束的函数。
我在做我的编码项目类似的东西,如果因为线程得到他们在循环后销毁内循环定义结束使用运营商
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
我在想同样的事情,除了把代码放在'{}'中做一个并发执行的范围。 – luk32
号调用者有责任确保使用分配对象是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
是具有运算符重载表现很像与删除东西的差别的指针指向一个对象(如果有的话)在其寿命时结束。
通常当你使用新的,你分配内存,你需要使用删除来删除它或内存区域将保持分配,直到程序结束 –
@TemaniAfif你可能是指'删除'。 – Ron
@Ron yes!免费与malloc,只是一个错误... –