多线程应用程序中的进程大小不断增长

时间:2018-09-13 14:55:46

标签: 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请求,这次进程的大小没有增加。 第一次迭代中增加的内存被重用。 与操作系统行为有关吗?

1 个答案:

答案 0 :(得分:2)

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

线程也不会立即被丢弃,因为创建它们是昂贵的过程。因此,std::thread完成后,实际线程仅移至线程池中以备将来重用。

此标准库行为十分广泛和复杂。

但是,如果您的程序持续增长(不要停止在某个水平), 那么您的应用程序中必须存在内存泄漏。 在这种情况下,我建议使用一些工具来检测内存泄漏,例如,clang地址清理器很棒。