C++ 与当前进程的性能计数器的竞争条件

C++ 与当前进程的性能计数器的竞争条件,c++,windows,performancecounter,pdh,C++,Windows,Performancecounter,Pdh,我正试图回避旧的“问题”。基本上,我要得到一个进程对象列表,然后查询它们的进程id并与我自己的进程id进行比较 基于此,我可以使用正确的实例索引(创建类似于\Process(my#u program#3)\)的内容)构建性能计数器路径,然后使用该路径查询我感兴趣的任何计数器。但是,如果my_程序的一个或多个其他实例在调用之前退出,会发生什么?如果我理解正确,这意味着我的计数器路径现在引用了另一个进程,或者现在无效。它们甚至可能在查询进程id时消失 在使用计数器路径获取计数器句柄之前,如何防止计数

我正试图回避旧的“问题”。基本上,我要得到一个进程对象列表,然后查询它们的进程id并与我自己的进程id进行比较

基于此,我可以使用正确的实例索引(创建类似于
\Process(my#u program#3)\
)的内容)构建性能计数器路径,然后使用该路径查询我感兴趣的任何计数器。但是,如果my_程序的一个或多个其他实例在调用之前退出,会发生什么?如果我理解正确,这意味着我的计数器路径现在引用了另一个进程,或者现在无效。它们甚至可能在查询进程id时消失


在使用计数器路径获取计数器句柄之前,如何防止计数器路径无效?哇,你说得对。对我来说,这似乎是一个主要的设计缺陷。基本上,如果实例的名称不唯一,就不可能可靠地监视它。我确实偶然发现了一个专门针对进程和线程对象的全局设置,但这是一个可能会影响其他应用程序的全局设置


我认为最安全的方法是监视所有进程对象,每次收集数据时,都会仔细检查并找到具有所需进程Id的对象。

我非常确定现有计数器的路径不会改变。实例可能来来去去去,最终循环使用标识符(从而循环使用路径),但只要实例存在,我很确定它将具有相同的标识符(从而循环使用路径)。如果不是这样的话,我会感到震惊。@Luke:不幸的是,路径确实变得无效了。当另一个实例已经启动时,在调试器中打开程序,然后单步执行以允许程序确定正确的实例(#1),然后手动关闭第一个实例,就可以很容易地证明这一点,然后再次单步执行以允许程序查询计数器-它们将不起作用。该解决方法可能会影响其他应用程序,因此不会像您自己指出的那样运行。监控所有流程是否会有所帮助?据我所知,没有办法将打开的计数器映射到它所属的进程。我认为使用PdhAddCounter无法做到这一点。也许您可以使用注册表接口为所有进程收集多个计数器;在这种情况下,我相信计数器将按顺序存储每个对象,您可以从中找出它。不过,我可能错了;我是从我最近实现的一个提供者的角度来考虑这个问题的。MSDN声明:“您不应该使用注册表函数来使用计数器数据。”这是一个建议,而不是强制要求。PDH API使用起来更简单,但注册表API的功能更强,这是以困难和繁琐为代价的。