STL(堆内存)的 OpenMP 内存泄漏

问题描述 投票:0回答:1
#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 泄漏更多。

c++ openmp
1个回答
0
投票

在多个线程写入单个容器的情况下,

std::vector
不是线程安全的。

主要原因是

push_back
会导致底层数组的重新分配。

您应该使用线程安全容器

© www.soinside.com 2019 - 2024. All rights reserved.