共享内存段 C++ 中 class 的新实例
New instance of class in a shared memory segment C++
实际上,我正在尝试在 C++ 中加强线程、进程和共享内存,但实际上我受困于我的进程间通信。
我决定使用消息队列,因为我已经在过去的项目中使用过一些,但从未使用过多进程。
这是我的问题,我无法从不同进程获取注册事件。我认为在共享内存段中初始化我的消息队列可以解决问题,但我无法弄清楚如何 "force" 我的 class 的新实例位于我的共享内存段
因为我是从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。
任何帮助将不胜感激。
我会使用托管内存段,这样你就可以"just"在共享内存中构造你的类型(注意:确保它们是 POD 或采用共享内存分配器来正确处理任何动态 allocation/reference).
#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
所以,当有疑问时,我建议使用它。
实际上,我正在尝试在 C++ 中加强线程、进程和共享内存,但实际上我受困于我的进程间通信。
我决定使用消息队列,因为我已经在过去的项目中使用过一些,但从未使用过多进程。
这是我的问题,我无法从不同进程获取注册事件。我认为在共享内存段中初始化我的消息队列可以解决问题,但我无法弄清楚如何 "force" 我的 class 的新实例位于我的共享内存段
因为我是从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。
任何帮助将不胜感激。
我会使用托管内存段,这样你就可以"just"在共享内存中构造你的类型(注意:确保它们是 POD 或采用共享内存分配器来正确处理任何动态 allocation/reference).
#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
所以,当有疑问时,我建议使用它。