与当前过程的性能计数器竞争条件

时间:2011-09-28 14:30:45

标签: c++ windows performancecounter pdh

我正试图解决旧的“How do I get a Windows Performance Counter for the current process”问题。基本上我是enumerating Process Object instances来获取Process对象的列表,然后我可以查询它们的进程ID并与我自己进行比较。

基于此,我可以使用正确的实例索引构建一个性能计数器路径(以创建类似于\Process(my_program#3)\<counter>的东西),然后我可以使用它来查询我感兴趣的任何计数器。但是会发生什么如果my_program的其他一个或多个实例在PdhAddCounter通话之前退出?如果我理解正确,这将意味着我的反路径现在指的是不同的进程或现在无效。在查询进程ID时,它们甚至可能会消失......

在我可以使用它来获取计数器句柄之前,如何防止计数器路径变为无效?

1 个答案:

答案 0 :(得分:0)

哇,你是对的。这对我来说似乎是一个重大的设计缺陷。基本上,如果一个实例的名称不是唯一的,就不可能可靠地监视它。我偶然发现了一个专门针对Process和Thread对象的workaround,但这是一个可能影响其他应用程序的全局设置。

我认为最安全的方法是观察所有流程对象,每次收集数据时都会查找具有所需流程ID的数据。