gpt4 book ai didi

c++ - 使用boost进程间访问共享对象的 vector 元素

转载 作者:行者123 更新时间:2023-11-30 00:59:38 24 4
gpt4 key购买 nike

我正在尝试了解 boost 进程间库的工作原理。我有一个设备类,它在 vector 容器中保存整数值。

在父父进程中;我在 MySegmentObject 段中构建了设备对象,并在该对象的构造函数中在 MySegmentVector 段中创建了 vector 。

使用子进程;我想访问创建的对象并获取 vector 的大小。我可以使用 segment->find 方法访问对象,但是当我从访问的对象调用 getSize() 方法时,它崩溃了!

我做错了什么,可能我缺少关于共享内存概念的东西。

我在 Visual Studio 2010 和 boost 1.43.0 lib 上测试了代码

设备.h

#pragma once
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/containers/vector.hpp>
#include <boost/interprocess/allocators/allocator.hpp>

using namespace boost::interprocess;

typedef boost::interprocess::allocator<int, managed_shared_memory::segment_manager> ShmemAllocator;
typedef boost::container::vector<int, ShmemAllocator> EqVector;

class Equipments {
public:
Equipments(void);
~Equipments(void);
void addEquipment(int n);
int getSize();
int getElement(int n);

private:
const ShmemAllocator *alloc_inst;
<offset_ptr>EqVector eqVector;
managed_shared_memory *segment;
};

设备.cpp

#include "StdAfx.h"
#include "Equipments.h"
#include <iostream>

Equipments::Equipments(void)
{
shared_memory_object::remove("mySegmentVector");
segment = new managed_shared_memory(create_only, "mySegmentObjectVector", 65536);
alloc_inst = new ShmemAllocator(segment->get_segment_manager());
eqVector = segment->construct<EqVector>("myVector")(*alloc_inst);
}


Equipments::~Equipments(void)
{
}

void Equipments::addEquipment(int n)
{
eqVector->push_back(n);
}

int Equipments::getSize()
{
return eqVector->size();
}

int Equipments::getElement(int n)
{
return eqVector->at(n);
}

main.cpp

#include "stdafx.h"
#include "Equipments.h"
#include <iostream>
#include <string>
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/containers/vector.hpp>
#include <boost/interprocess/allocators/allocator.hpp>

using namespace boost::interprocess;

int main(int argc, char *argv[])
{
if (argc == 1)
{
std::cout << "parent process" << std::endl;
shared_memory_object::remove("mySegmentObject");
managed_shared_memory segment(create_only, "mySegmentObject", 65536);
Equipments *eqPtr = segment.construct<Equipments>("EQ")();

eqPtr->addEquipment(19);
eqPtr->addEquipment(12);

//Launch child process
std::string s(argv[0]); s += " child ";
if(0 != std::system(s.c_str()))
return 1; //Launch child process
}
else
{
std::cout << "child process" << std::endl;
managed_shared_memory *segment = new managed_shared_memory(open_only, "mySegmentObject");
std::pair<Equipments*, std::size_t> p = segment->find<Equipments>("EQ");

if (p.first)
{
std::cout << "EQ found" << std::endl;
std::cout << p.first->getSize() << std::endl;
}
else
{
std::cout << "EQ not found" << std::endl;
}
}
}

最佳答案

问题是您使用普通指针来存储 EqVector。当您映射共享内存段时,它可能会映射到进程地址空间中的任何位置。这意味着 eqVector 在内存中的存储位置在第一个进程的内存空间中与在第二个进程中的内存空间不同。您需要使用 boost::offset_ptr,它将地址存储为从共享内存段开始的偏移量,请参见此处:http://www.boost.org/doc/libs/1_35_0/doc/html/interprocess/offset_ptr.html

关于c++ - 使用boost进程间访问共享对象的 vector 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4034829/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com