Я просто пытаюсь создать кольцевой буфер в разделяемой памяти и выполнить в нем некоторые операции вставки и поиска.
Итак, сначала я создаю свои типы:
typedef allocator<MyData, managed_shared_memory::segment_manager> ShmemAllocator;
typedef boost::circular_buffer<MyData,ShmemAllocator> cbMyDataContainerType;
Указатели на сегмент и контейнер:
managed_shared_memory *segment;
cbMyDataContainerType *cbMyDataContainer;
Ранее я успешно создал общую память и уже использую ее для совместного использования некоторых других объектов, поэтому здесь я нахожу ранее созданную общую память и пытаюсь создать кольцевой буфер:
segment = new managed_shared_memory(open_only, "MySharedMemory");
const ShmemAllocator alloc_inst (segment->get_segment_manager());
cbMyDataContainer = segment->construct<cbMyDataContainerType>
("MyDataContainerCircularBuffer")(alloc_inst), (CONTAINER_SIZE);
И попробуйте вставить некоторые значения здесь:
cbMyDataContainer->push_back(MyData(id, dataTime));
После этого я пытаюсь сбросить в контейнер так:
int count = 0
for (cbMyDataContainerType::iterator it = cbMyDataContainer->begin(),
it_end = cbMyDataContainer->end(); it != it_end; ++it, count++)
{
std::cout << "Id : "<< it->id << " Time : " << it->dTime << std::endl;
}
Но проблема в том, при создании контейнера кажется, что все в порядке (по крайней мере, без исключений), но он не принимает размер (sizeof (cbMyContainer) кажется 8, но CONTAINER_SIZE равен 10000, поэтому он должен быть чем-то вроде 8 * 10000?), и я не могу вставить любой предмет на контейнере.
Когда я пытаюсь сбросить контейнер, он даже не входит в цикл for, поскольку в нем нет вставленного элемента.
У вас есть идеи о том, что здесь не так?
Спасибо большое…
Примечание: я использую Visual Studio 2008 VC ++, Win7 x64
Это было давно, но я думаю, что вы должны передать размер в кольцевой буфер при его создании. Что-то вроде:
cbMyDataContainer = segment->construct<cbMyDataContainerType>
("MyDataContainerCircularBuffer")(CONTAINER_SIZE, alloc_inst);
Других решений пока нет …