【问题标题】:Allocated memory for a thread in C++为 C++ 中的线程分配的内存
【发布时间】:2013-12-30 11:49:24
【问题描述】:

是否可以在 C++ 编程的窗口中获取线程的内存使用情况? (我知道这对于使用 GetProcessMemoryInfo API 的进程是可能的。)

【问题讨论】:

  • 这将如何工作?您如何确定哪个线程正在使用任何特定的内存块?所有线程共享相同的地址空间,这意味着它们的“内存使用量”都是一样的
  • @Spook 你读过这个问题吗?
  • 好的,我错过了线程/进程的细微差别。
  • 我相信线程和进程共享相同的地址空间不是吗?
  • 线程没有地址空间——它是一个进程属性。

标签: c++ multithreading memory


【解决方案1】:

不存在这样的事情,因为虽然线程有一些半私有内存(线程本地存储),但在线程运行时分配的大部分内存是进程内存空间的一部分。

解决您的问题的方法是覆盖各种分配函数(例如 malloc),并让每个 malloc 使用当前线程 ID 注册分配。您还需要一个 API 来查询分配数据库,了解分配了多少。

【讨论】:

  • 由线程 A 分配然后向线程 B 发出信号的缓冲区会发生什么?线程 A 分配了它,但现在没有引用它,线程 B 正在使用它,完成后将释放它。
  • 实现细节...同样的功能可以扩展到free()。
  • OP:'是否可以获取线程的内存使用情况',而不是'分配的内存'。在任何情况下,许多线程的“内存使用”主要是堆栈,至少部分是在线程存在之前分配的,并且其当前分配是由操作系统管理的。
【解决方案2】:

来自共享堆的内存分配与线程无关。

除非您使用每个线程的特定堆或其他一些记帐机制,否则操作系统无法知道哪个线程正在使用什么内存,因为多个线程可能正在使用相同的内存区域。 如果您决定使用 HeapCreate 在 Windows 上使用单独的堆(例如 1 个/线程),则可以使用 HeapWalk 枚举每个堆的所有已分配块,并对每个线程分配的总内存求和。

【讨论】:

    【解决方案3】:

    我没有看到任何 Windows API 可以为您做到这一点。正如其他人所指出的那样,堆使用并不特定于线程,您唯一能做的就是跟踪哪个线程分配了多少。但是,如果您只对堆栈使用感兴趣,它特定于每个线程,那么它是直接实现一对可以从线程上下文中调用的函数,这些函数将告诉您当时正在使用多少堆栈空间。为此,您可以将线程入口函数中自动变量的地址作为“堆栈顶部”保存到全局线程安全映射中,以供以后查找(例如 void SaveCurrentThreadStackTop(void*);)使用线程 ID 作为键。然后在使用时调用一个函数(比如 size_t GetCurrentThreadStackUsage(void);),该函数声明另一个自动变量并将其从先前为当前线程 ID 保存的“堆栈顶部”中减去。结果可能对字节不准确,但足够接近。

    【讨论】:

    • CreateThread 的参数决定了最大堆栈大小,如果您正在运行一些递归算法并想要跟踪您离触发堆栈溢出异常的距离有多近,上述可能很有用。
    猜你喜欢
    • 2010-09-13
    • 1970-01-01
    • 2021-11-18
    • 2014-06-21
    • 2010-10-21
    • 2015-12-28
    • 1970-01-01
    • 2018-10-21
    • 2014-10-25
    相关资源
    最近更新 更多