进程(应用程序)的并行实例数
Number of parallel instances of my process (app)
是否有一些便携式的方法来检查我的应用程序的并行实例的数量?
我有一个c++应用程序(win32),我需要知道它启动的频率。问题是几个用户可以并行启动它(终端服务器),所以我不能搜索"正在运行的进程"列表,因为我不能访问其他用户的列表。
我用Semaphore (boost &win32 CreateSemaphore)可以它工作了,但现在我有问题,如果应用程序崩溃(断言或只是杀死进程)计数器没有改变。(重新启动帮助)
在我的代码中手动删除/重置信号量计数器是不可能的,因为我不知道是否有人正在运行我的应用程序
添加:
假设您有一个许可,允许您运行20个完整功能的程序副本。然后可以有20个互斥锁,命名为MyProgMutex1到MyProgMutex20。在启动时,程序可以在互斥体之间循环。如果它找到一个可用的备用互斥锁,它就停止循环并进入全功能模式。如果它循环遍历所有互斥锁而不能取其中任何一个,则它进入功能减少模式。
原始回答:
我假设您想要确保一次只运行一个进程副本。(或者,对于终端服务器,每个登录会话一个进程副本)。
您的命名信号量解决方案很接近。正确的方法是使用命名互斥锁。使用CreateMutex创建互斥对象,然后调用WaitForSingleObject,超时为零。如果WaitForSingleObject返回WAIT_TIMEOUT,则进程的另一个副本正在运行。如果它返回WAIT_OBJECT_0或WAIT_ABANDONED,那么您就是该进程的唯一副本。你需要在程序运行时保持互斥句柄打开——要么在进程即将退出时调用CloseHandle,要么在进程退出时故意泄漏该句柄,并依靠Window内置的清理功能为你释放该句柄。当你的进程退出时,Windows会自动增加互斥锁的计数器。
我能想到的缓解进程崩溃问题的唯一方法是一种"死人开关":每个进程需要定期更新其状态。如果一个进程没有做到这一点,它将自动从活动进程列表中被丢弃。
该技术要求其中一个进程充当服务器,保持其他进程最近是否更新的标签。如果服务器死亡,那么另一个进程可以接管。这反过来又要求每个进程测试是否还有一个存活的服务器。
或者,每个进程可以是它自己的服务器,并在本地保持跟踪。这比服务器切换更容易实现。
您可以广播消息,您的应用程序的其他实例应该发送一些响应。
- 从C++实例化QML
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 我收到以下错误:抛出'std::bad_alloc'实例后终止调用
- C++17中的并行执行策略
- 建议在运行时将带有类实例的列表从c++导入qml
- 约束和显式模板实例化
- 通过实例理解std::move及其目的
- 并行用于C++17中数组索引范围内的循环
- 我们如何并行运行算法的 n 个实例并以有效的方式计算结果函数的平均值?
- 在任何地方对C++中所有并行线程中的所有锁定和解锁实例使用相同的 std::mutex 和 lock 对象
- pthread以并行方式运行类实例的方法
- 2个不同的task_group实例没有并行运行任务