【问题标题】:Ways of identifying the state of opened shared memory识别打开共享内存状态的方法
【发布时间】:2019-12-27 19:17:25
【问题描述】:

我正在研究如何使用 boost::interprocess,我正在处理一个应用程序,我的进程可以以或多或少不可预测的顺序启动,但我不知道如何告诉他们哪个是首先。它们是按需启动的,我想不出在它们开始之前进行任何清理的好方法。

我需要知道哪个进程是第一个在开始时正确初始化所有内容的进程。我正在使用命名互斥锁来确保第一个进程可以在其他进程开始工作之前初始化它需要的所有内容。

在理想情况下,我可以检查是否已经使用open_only 模式创建了共享内存对象,捕获异常并进行初始化。很好,很简单,而且很有效。

在不太理想的情况下,我可以将内存标记为已丢弃(在共享数据结构中放置一个字段,或将该信息存储在其他地方),如果进程启动并发现虚假状态,它将重新初始化一切。好像可以用。

不过,最糟糕的情况是应用程序崩溃了,并且共享内存中没有任何迹象表明任何东西都关闭了。更糟糕的是,可能会在共享内存或命名内存中留下锁定的互斥锁。

我该如何处理这样的问题? 如何判断给定进程是否正在加入正在运行的应用程序中的其他工作人员,或者是刚刚启动的应用程序中的第一个工作人员?

我正在寻求有关如何处理此问题、如何解决该问题以及如何查找更多信息的建议。

谢谢。

【问题讨论】:

  • 你使用的是什么操作系统?
  • Windows 和 Linux
  • 在一个 Windows 项目中,我这样做了 - 每个进程启动时,它都会创建自己的锁定命名互斥体(比如“process1”)。然后通过一个单独保护的共享内存对象,每个进程可以看到有多少进程已经启动。当一个进程完成时,它将解锁静音,关闭句柄并终止。当其他进程测试互斥体的状态并获得访问权限时,这意味着该进程不再运行。

标签: c++ ipc boost-interprocess


【解决方案1】:

我正在处理一个可以在其中启动我的进程的应用程序 或多或少不可预测的顺序,我不知道如何分辨 他们谁是第一个。

知道首先启动哪个进程等并不能让您更接近解决问题。

更糟糕的是,可能还有锁定的互斥锁,无论是在共享 记忆或命名的。

操作系统会处理该部分并释放崩溃者持有的所有锁(不过这可能需要一点时间)

使用命名信号量

我想您可以在这种情况下使用命名信号量 - 这样我相信可以知道有多少进程正在运行/使用内存/您选择建模的任何资源.

您是如何设计或建模信号量的,我想不起来了,但是 boost 进程间库确实包含一个命名信号量。

【讨论】:

  • 信号量在崩溃后不会保持其状态吗?因此,如果我使用open_or_create,信号量将保持其在崩溃或其他不正常关闭之前的计数。另外,我不确定会创建多少任务,所以我不能用它来等待任何事情。除非你的意思是它可以用作原子计数器? ...另外,我没有对你投反对票
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-08
  • 1970-01-01
  • 1970-01-01
  • 2020-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多