【问题标题】:New instance of class in a shared memory segment C++共享内存段 C++ 中类的新实例
【发布时间】:2020-08-24 06:46:29
【问题描述】:

我实际上是在尝试在 C++ 中提高线程、进程和共享内存,但实际上我的进程间通信卡住了。

我决定使用消息队列,因为我在过去的项目中已经使用了一些,但从未使用过多个进程。

这是我的问题,我无法从不同的进程获取注册事件。我认为在共享内存段中初始化我的消息队列可以解决问题,但我不知道如何“强制”我的类的新实例在我的共享内存段中

因为我从 C++ 中的共享内存开始,所以我使用 boost Simple Exemple

理想情况下,我想要的是这样的:

int main (void)
{
    shared_memory_object shm (open_or_create, "MySharedMemory", read_write);

    // initialise shm using boost Simple Exemple

    shmPtr = region.get_address();

    // initialise message queue named msgQueue in my shared memory segment

    msgQueuePtr = &msgQueue;

}

最后,shmPtr 将等于 msgQueuePtr。
任何帮助将不胜感激。

【问题讨论】:

  • 查看新的展示位置
  • 共享内存的常见问题是你不能存储指针,因为两个进程的地址空间会不同。因此,一个进程中的有效指针将是另一个进程中的无效指针。
  • 这能回答你的问题吗? Create new C++ object at specific memory address?
  • @MikeVine Boost Interprocess 的重点是隐藏这些机制
  • 好的@MikeVine 我会检查的。谢谢

标签: c++ boost ipc shared-memory


【解决方案1】:

我会使用托管内存段,这样您就可以“仅”在共享内存中构造您的类型(注意:确保它们是 POD 或采用共享内存分配器来正确处理任何动态分配/引用)。

#include <boost/interprocess/managed_shared_memory.hpp>
#include <iostream>

struct MyQueue { /* */ };

namespace bip = boost::interprocess;

int main() {
    bip::managed_shared_memory msm(bip::open_or_create, "test", 10ul<<30); // 10 MiB
    MyQueue& q = *msm.find_or_construct<MyQueue>("queue_instance")();
}

这是一个更大的演示,包含队列实现 + 锁定等。Boost shared memory and synchronized queue issue/crash in consumer process

奖金

Boost Interprocess 有完整的 message_queue 实现:https://www.boost.org/doc/libs/1_73_0/doc/html/boost/interprocess/message_queue.html

所以,如果有疑问,我建议使用它。

【讨论】:

  • 我不知道 boost 已经有一个 message_queue,谢谢你的信息,我暂时用这个。我可能稍后会回来(当我的项目结束时)尝试你给我的另一种方法。非常感谢
猜你喜欢
  • 2017-08-28
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多