如何安全地删除boost :: shared_memory_object

时间:2011-10-31 19:48:32

标签: c++ boost shared-memory boost-interprocess

我正在使用boost :: shared_memory_object进行IPC。我有一个客户端和服务器。我使用两个消息队列。一个用于向服务器发送请求,另一个用于从服务器接收回复。它是一种异步协议。我的问题是我不知道如何在发生故障时安全地删除shared_memory_objects。请考虑以下情况:

  1. 服务器启动
  2. 客户端启动并连接到服务器;消息队列在共享内存中创建。
  3. 客户端向服务器发送常规心跳;一切都好。
  4. 客户受到太多处理的困扰;想念一些心跳
  5. 服务器认为客户端已死,清理队列(shared_memory_object :: remove将删除队列,即使存在正在运行的进程,并打开该共享内存段的句柄)
  6. 客户完​​成处理;尝试写入已删除的消息队列:
  7. 这里所有的地狱都破裂了。有时写入成功,有时会崩溃。谁知道在删除消息队列之后是否有其他进程在同一个内存地址上创建了新的共享内存对象......

    显然,如果客户端认为服务器已关闭并且删除了队列,则尝试读取/写入队列的服务器线程可能会崩溃(或损坏内存)。

0 个答案:

没有答案