【发布时间】:2019-12-27 19:17:25
【问题描述】:
我正在研究如何使用 boost::interprocess,我正在处理一个应用程序,我的进程可以以或多或少不可预测的顺序启动,但我不知道如何告诉他们哪个是首先。它们是按需启动的,我想不出在它们开始之前进行任何清理的好方法。
我需要知道哪个进程是第一个在开始时正确初始化所有内容的进程。我正在使用命名互斥锁来确保第一个进程可以在其他进程开始工作之前初始化它需要的所有内容。
在理想情况下,我可以检查是否已经使用open_only 模式创建了共享内存对象,捕获异常并进行初始化。很好,很简单,而且很有效。
在不太理想的情况下,我可以将内存标记为已丢弃(在共享数据结构中放置一个字段,或将该信息存储在其他地方),如果进程启动并发现虚假状态,它将重新初始化一切。好像可以用。
不过,最糟糕的情况是应用程序崩溃了,并且共享内存中没有任何迹象表明任何东西都关闭了。更糟糕的是,可能会在共享内存或命名内存中留下锁定的互斥锁。
我该如何处理这样的问题? 如何判断给定进程是否正在加入正在运行的应用程序中的其他工作人员,或者是刚刚启动的应用程序中的第一个工作人员?
我正在寻求有关如何处理此问题、如何解决该问题以及如何查找更多信息的建议。
谢谢。
【问题讨论】:
-
你使用的是什么操作系统?
-
Windows 和 Linux
-
在一个 Windows 项目中,我这样做了 - 每个进程启动时,它都会创建自己的锁定命名互斥体(比如“process1”)。然后通过一个单独保护的共享内存对象,每个进程可以看到有多少进程已经启动。当一个进程完成时,它将解锁静音,关闭句柄并终止。当其他进程测试互斥体的状态并获得访问权限时,这意味着该进程不再运行。
标签: c++ ipc boost-interprocess