在C ++中为线程分配内存

时间:2013-12-30 11:49:25

标签: c++ multithreading memory

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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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