我的进程(app)的并行实例数

时间:2011-09-29 15:36:20

标签: c++ process

是否有一些可移植的方式来检查我的应用程序的并行实例数?

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

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

也无法在我的代码中手动删除/重置信号量计数器,因为我不知道其他人是否正在运行我的应用程序。

3 个答案:

答案 0 :(得分:2)

编辑添加:

假设您拥有可以运行程序的20个完整功能副本的许可证。然后你可以有20个互斥锁,名为MyProgMutex1到MyProgMutex20。在启动时,您的程序可以遍历互斥锁。如果找到可以使用的备用互斥锁,它将停止循环并进入全功能模式。如果它在所有互斥锁中循环而不能使用它们中的任何一个,那么它将进入缩减功能模式。

原始答案:

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

您的命名信号量解决方案已关闭。正确的方法是使用命名的互斥锁。使用CreateMutex制作互斥锁,然后以超时零调用WaitForSingleObject。如果WaitForSingleObject返回WAIT_TIMEOUT,则该进程的另一个副本正在运行。如果它返回WAIT_OBJECT_0或WAIT_ABANDONED,那么您就是该进程的唯一副本。您需要在程序运行时保持互斥锁手柄处于打开状态 - 当您的进程即将退出时调用CloseHandle,或者只是故意泄漏句柄并依赖Window的内置清理来为您释放句柄进程退出。当进程退出时,Windows将自动增加互斥锁的计数器。

答案 1 :(得分:1)

我能想到的唯一可以缓解崩溃进程问题的方法是“dead man’s switch”:每个进程都需要定期更新其状态。如果进程无法执行此操作,则会自动从活动进程列表中将其丢弃。

此技术要求其中一个进程充当服务器,以保留其他进程最近是否已更新的选项卡。如果服务器死了,那么另一个进程可以接管。反过来,这要求每个进程测试是否仍然存在服务器。

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

答案 2 :(得分:1)

您可以广播消息,应用程序的其他实例应该发送一些响应。您计算回复 - 您获得实例数。