我正在为 IPC 使用 boost::shared_memory_object。我有一个客户端和服务器。我使用两个消息队列。一种用于向服务器发送请求,另一种用于从服务器接收回复。它是一个异步协议。我的问题是我不知道如何在失败的情况下安全地删除 shared_memory_objects。考虑这种情况:
- 服务器启动
- 客户端启动并连接到服务器;消息队列是在共享内存中创建的。
- 客户端定期向服务器发送心跳;一切都好。
- 客户因处理过多而受阻;错过了一些心跳
- 服务器认为客户端已死,清理队列(shared_memory_object::remove 将删除队列,即使有一个正在运行的进程打开了该共享内存段的句柄)
- 客户端完成处理;尝试写入已删除的消息队列:
所有的地狱都在这里崩溃了。有时写入成功,有时会崩溃。谁知道消息队列被删除后,其他进程是否在同一内存地址上创建了新的共享内存对象……
显然,如果客户端认为服务器已关闭并删除队列,则尝试读取/写入队列的服务器线程可能会崩溃(或损坏内存)。