进程(应用程序)的并行实例数

Number of parallel instances of my process (app)

本文关键字:并行 实例 应用程序 进程      更新时间:2023-10-16

是否有一些便携式的方法来检查我的应用程序的并行实例的数量?

我有一个c++应用程序(win32),我需要知道它启动的频率。问题是几个用户可以并行启动它(终端服务器),所以我不能搜索"正在运行的进程"列表,因为我不能访问其他用户的列表。

我用Semaphore (boost &win32 CreateSemaphore)可以它工作了,但现在我有问题,如果应用程序崩溃(断言或只是杀死进程)计数器没有改变。(重新启动帮助)

在我的代码中手动删除/重置信号量计数器是不可能的,因为我不知道是否有人正在运行我的应用程序

添加:

假设您有一个许可,允许您运行20个完整功能的程序副本。然后可以有20个互斥锁,命名为MyProgMutex1到MyProgMutex20。在启动时,程序可以在互斥体之间循环。如果它找到一个可用的备用互斥锁,它就停止循环并进入全功能模式。如果它循环遍历所有互斥锁而不能取其中任何一个,则它进入功能减少模式。

原始回答:

我假设您想要确保一次只运行一个进程副本。(或者,对于终端服务器,每个登录会话一个进程副本)。

您的命名信号量解决方案很接近。正确的方法是使用命名互斥锁。使用CreateMutex创建互斥对象,然后调用WaitForSingleObject,超时为零。如果WaitForSingleObject返回WAIT_TIMEOUT,则进程的另一个副本正在运行。如果它返回WAIT_OBJECT_0或WAIT_ABANDONED,那么您就是该进程的唯一副本。你需要在程序运行时保持互斥句柄打开——要么在进程即将退出时调用CloseHandle,要么在进程退出时故意泄漏该句柄,并依靠Window内置的清理功能为你释放该句柄。当你的进程退出时,Windows会自动增加互斥锁的计数器。

我能想到的缓解进程崩溃问题的唯一方法是一种"死人开关":每个进程需要定期更新其状态。如果一个进程没有做到这一点,它将自动从活动进程列表中被丢弃。

该技术要求其中一个进程充当服务器,保持其他进程最近是否更新的标签。如果服务器死亡,那么另一个进程可以接管。这反过来又要求每个进程测试是否还有一个存活的服务器。

或者,每个进程可以是它自己的服务器,并在本地保持跟踪。这比服务器切换更容易实现。

您可以广播消息,您的应用程序的其他实例应该发送一些响应。