int **something = new int *[N];
for(int n = 0; n < N; n++)
    something[n] = new int[M];

#pragma omp parallel for
for (int n = 0; n < N; n++)
    delete[] something[n];
delete[] something;

我可以像这样并行化一个删除进程吗?

Linux的OOM杀手在大量循环后杀死了我的进程.我试图找出内存泄漏的位置,但我找不到.我不确定这些FOR循环删除过程是否运行良好.

推荐答案

这通常是可以的.标准的(G)libc堆必须是线程安全的;否则,根本不可能编写线程化程序.也可以在一个线程上分配缓冲区,然后在另一个线程上释放它.

并行化堆分配不会给您带来很大的加速,但我怀疑您这样问并不是因为您想加速(取消)分配,而是因为您有一些其他并行代码恰好分配和释放了一些缓冲区.

要找到漏洞,请try 使用valgrind运行您的程序.

此外,考虑在释放大量内存后调用malloc_trim(0);.这使glibc将未使用的内存释放回操作系统,而不是保留所有内存以供以后分配.

Linux相关问答推荐

将UTC字符串日期时间转换为毫秒UTC时间戳

git别名函数可以用单引号写吗?

如何在 shell 脚本中自定义 SFTP 详细输出

AWK:按第一列匹配两个文件不起作用

在正在运行的进程的输出周围添加自定义字符串

使用来自 yocto build 而不是主机系统的 protoc

如何验证所有 csv 文件是否具有相同的第一行?

在 bash 中获取目录或文件的基本名称的快速且正确的方法

将行转换为一条

从 .war 文件外部化 Tomcat webapp 配置

Git为每次推送输入长密码

KDE 桌面效果中的 OpenGL 和 XRender 有什么区别?

crontab 命令单独一行

如何知道linux调度器时间片?

C++:使用 longjmp 和 setjmp 安全吗?

计算每个进程打开的文件

如何在redhat linux上安装maven

linux脚本杀死java进程

id_rsa.pub 文件 SSH 错误:格式无效

适用于 Windows、Linux、MacOS X 的跨平台脚​​本