#include <malloc.h>
#include <vector>
#include <iostream>
#include <chrono>
#include <thread>
void test_openmp(const size_t for_n, const size_t vec_n)
{
std::cout << "running openmp" << std::endl;
#pragma omp parallel for
for (size_t i = 0; i < for_n; ++i)
{
std::vector<int> local_v;
for (size_t j = 0; j < vec_n; ++j)
{
local_v.push_back(j);
}
}
std::cout << "finished openmp" << std::endl;
}
int main()
{
std::cout << "sleeping" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(10));
test_openmp(20, 5000000);
malloc_trim(0);
std::cout << "sleeping" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(10));
return 0;
}
看起来如果使用 STL 或 openmp 多线程的堆内存分配会出现内存泄漏。 在我的 8 核 Ubuntu 22 平台上,运行
htop
后,它泄漏了约 200MB(由 test_openmp(20, 5000000);
观察到)。
这是一个已知问题,我不应该在多线程中分配任何堆内存吗?
应该如何正确使用呢?
int local_v[vec_n]
(无堆内存)没问题。#pragma omp parallel for num_threads(1)
还好。
而且看起来随着使用的 num_threads 泄漏更多。