C++程序潜在的内存泄漏
c++ program potential memory leak
我每 40 毫秒调用以下 void function()
函数,我发现内存消耗稳定增加。刚开始消耗不明显,过几天消耗就很大了。任何人都可以帮助解释这段代码有什么问题。是线程问题还是std::move
问题导致内存泄露
void do_task(const std::vector<int>& tmp)
{
// do some work here
}
void function()
{
std::vector<std::thread> task;
std::vector<int> tmp1, tmp2;
GetTempValue(tmp1);
GetTempValue(tmp2);
task.push_back(std::thread(do_task, std::move(tmp1)));
task.push_back(std::thread(do_task, std::move(tmp2)));
tmp1.clear();
tmp2.clear();
UpdateTempValue(tmp1);
UpdateTempValue(tmp2);
task.push_back(std::thread(do_task, std::move(tmp1)));
task.push_back(std::thread(do_task, std::move(tmp2)));
tmp1.clear();
tmp2.clear();
for(int i=0; i<task.size(); i++)
{
task[i].join();
}
}
传递对线程的引用是一个很大的禁忌。或者至少是一个等待发生的错误...
您应该尝试重新定义 do task 以按值接受 std::vector。这不是您通过调用 std::move 将它们传递给线程而尝试做的事情吗?
将 do_task 的定义更改为:
void do_task(std::vector<int> tmp);
我做了一些快速计算。如果由 function() 启动的线程泄漏,通过每 40 毫秒启动 4 个线程,您应该有超过 1.4MB/小时的泄漏率。如果你的泄漏小于那个,你应该开始在你的代码中寻找其他地方。
无论如何,每秒启动 100 个线程并不是很高效。创建线程时,你的计算能力会损失很大一部分。您是否考虑过其他选择?
拥有 4 个线程 运行 无限循环,并将工作排队交给它们会更有效率,减少 OS 的负担,并且更不容易出现无法控制的泄漏。
我认为 openmp 可能很有趣。 OpenMP 是用于开发并行应用程序的 API。
我每 40 毫秒调用以下 void function()
函数,我发现内存消耗稳定增加。刚开始消耗不明显,过几天消耗就很大了。任何人都可以帮助解释这段代码有什么问题。是线程问题还是std::move
问题导致内存泄露
void do_task(const std::vector<int>& tmp)
{
// do some work here
}
void function()
{
std::vector<std::thread> task;
std::vector<int> tmp1, tmp2;
GetTempValue(tmp1);
GetTempValue(tmp2);
task.push_back(std::thread(do_task, std::move(tmp1)));
task.push_back(std::thread(do_task, std::move(tmp2)));
tmp1.clear();
tmp2.clear();
UpdateTempValue(tmp1);
UpdateTempValue(tmp2);
task.push_back(std::thread(do_task, std::move(tmp1)));
task.push_back(std::thread(do_task, std::move(tmp2)));
tmp1.clear();
tmp2.clear();
for(int i=0; i<task.size(); i++)
{
task[i].join();
}
}
传递对线程的引用是一个很大的禁忌。或者至少是一个等待发生的错误...
您应该尝试重新定义 do task 以按值接受 std::vector。这不是您通过调用 std::move 将它们传递给线程而尝试做的事情吗?
将 do_task 的定义更改为:
void do_task(std::vector<int> tmp);
我做了一些快速计算。如果由 function() 启动的线程泄漏,通过每 40 毫秒启动 4 个线程,您应该有超过 1.4MB/小时的泄漏率。如果你的泄漏小于那个,你应该开始在你的代码中寻找其他地方。
无论如何,每秒启动 100 个线程并不是很高效。创建线程时,你的计算能力会损失很大一部分。您是否考虑过其他选择?
拥有 4 个线程 运行 无限循环,并将工作排队交给它们会更有效率,减少 OS 的负担,并且更不容易出现无法控制的泄漏。
我认为 openmp 可能很有趣。 OpenMP 是用于开发并行应用程序的 API。