c++ - 进程大小在多线程应用程序中增长

标签 c++ multithreading

我需要一些解决方案来解决问题。 在处理更多请求后,在我的应用程序中的不同线程中新建和删除进程大小不断增加而不是下降。

伪代码:

Main () {
    Thread1 enter
    Creating object and inserting into map.
    Thread1 exit

    Thread2 enter
    Itherating to the map and creating child thread based on the no of object in the map.
    Thread2 exit

    Child thread calling the function at the end deleting the object.
}

在 Thread1 中创建的对象在使用 Thread2 产生的子线程中删除。

上面的方法好吗?我犯了什么错误吗? 因为本地图中的对象数量增加时。 即使在删除所有分配的对象并清除映射后,进程大小也会迅速增长。 谁能告诉我进程规模增长的原因是什么?
更新:


有更新。我已经使用 libumem 工具检查了这个过程,它是检漏仪。什么都不显示。

当传入流量和删除率相等时,进程大小不会增长。 进程大小仅在交通繁忙时增加。 例子: 传入流量率为4000,删除率为100 进程大小增长。 在处理和删除所有请求后,预计进程大小会恢复正常但不会恢复正常。 另一个观察结果是我第一次发送 10k 请求 内存增加不下来 然后我再次发送 10k 请求,这次进程大小没有增加。 第一次迭代增加的内存被重新使用。 它与操作系统行为有关吗?

最佳答案

这就是标准库管理内存的方式。 从系统获取内存是非常昂贵的,所以它不会立即返回给系统,因为很有可能很快就会再次需要它。

线程也不会立即处理,因为创建它们是昂贵的过程。因此,当 std::thread 完成时,实际线程只是被移动到线程池中以供将来重用。

这个标准库行为非常广泛和复杂。

但是如果你的程序不断增长(不要停在某个级别), 那么您的应用程序中一定存在内存泄漏。 在这种情况下,我建议使用一些工具来检测内存泄漏,例如 clang address sanitizer 就很棒。

关于c++ - 进程大小在多线程应用程序中增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52316405/

相关文章:

c++ - 在 Qt 中,如何从 QNetworkRequest 中删除所有证书颁发机构的证书?

c++ - 函数 length() 可以带参数吗?

c++ - 如何使用变量作为其大小来声明 char 数组?

c# - 如何确保异常 "The calling thread cannot access this object because a different thread owns it"?

python - 从 PyQt 事件循环中执行 Python 代码

Java 多线程 - 最佳实践

c++ - graphics.h 的替代品

c++ - 高效积累

java - 线程优先级

multithreading - 子进程与父进程共享资源吗?