【发布时间】:2023-02-09 03:25:59
【问题描述】:
我有一个在线程中运行多个无限循环的项目,我将其简化为以下代码:
#include <iostream>
#include <vector>
#include <thread>
#include <boost/fiber/algo/round_robin.hpp>
#include <boost/thread.hpp>
#include <chrono>
#include <boost/thread.hpp>
#include <string>
void foo(){
std::cout<<"thread a"<<std::endl;
while(true){
std::this_thread::sleep_for(std::chrono::seconds{5});
}
return;
}
void foo2(){
std::cout<<"thread b"<<std::endl;
while(true){
std::this_thread::sleep_for(std::chrono::seconds{5});
}
return;
}
int main(){
std::thread a(foo);
std::thread b(foo2);
while(true){
std::this_thread::sleep_for(std::chrono::seconds{5});
}
return 0;
}
它按预期工作。 我使用 valgrind 来检测内存泄漏,它显示它有内存泄漏(我猜无限循环永远不会释放内存,因为它永远不会停止)。我考虑过使用 join(),但在这里没有意义。我试图添加
a.detach();
b.detach();
在 main 函数的 while 循环之前,但它没有解决内存泄漏问题。
有人可以给我一些建议如何避免内存泄漏吗?
【问题讨论】:
-
当您的程序无法以“正常”方式终止时,为什么还要担心泄漏?我确信您并不真的需要无法连接的线程。你的实际目标是什么?
-
向您的线程发出停止信号,即使用
stop_token或atomic<bool>,然后使用join()。 -
要点:您不需要
foo和foo2中的那些return;语句。 -
“他们永远不应该停止”,我认为你应该重新考虑这一点。即使是 24/7 运行的代码最终也必须在某个时刻终止。使线程可连接,然后可能不仅这个问题而且其他问题都会消失
-
分离线程很少是正确的解决方案。实际上,从长远来看,每当我认为我应该分离一个线程时,结果证明这是一个严重的错误
标签: c++ multithreading memory-leaks