В boost::interprocess
документации говорится, что контейнеры должны храниться в общей памяти:
- Контейнеры STL могут не предполагать, что память, выделенная с помощью распределителя, может быть освобождена с помощью других распределителей того же типа. Все объекты распределителей должны сравниваться на равных, только если память, выделенная для одного объекта, может быть освобождена другим, и это можно проверить только с
operator==()
во время выполнения. - Внутренние указатели контейнеров должны быть типа
allocator::pointer
, и контейнеры не могут предполагать, чтоallocator::pointer
является необработанным указателем. - Все объекты должны быть сконструированы-уничтожены с помощью функций
allocator::construct
иallocator::destroy
.
Я использую gcc 4.7.1 с -std = c ++ 11 (и boost 1.53). Безопасно ли использовать указанный ниже тип ShmVector
?
typedef boost::interprocess::allocator<int,
boost::interprocess::managed_shared_memory::segment_manager> ShmemAllocator;
typedef std::vector<int, ShmemAllocator> ShmVector;
Я попробовал фиктивный процесс, использующий этот тип, и, похоже, он работает, но я все еще не уверен, что вектор в gcc4.7.1 удовлетворяет всем требованиям. Я особенно не уверен в первом требовании.
#include <iostream>
#include <boost/interprocess/allocators/allocator.hpp>
#include <boost/interprocess/managed_shared_memory.hpp>
#include <vector>
#include <cstdlib> //std::system
typedef boost::interprocess::allocator<int,
boost::interprocess::managed_shared_memory::segment_manager> ShmemAllocator;
typedef std::vector<int, ShmemAllocator> ShmVector;
int main(int argc, char *argv[])
{
if(argc == 1){ //Parent process
struct shm_remove
{
shm_remove() { boost::interprocess::shared_memory_object::remove("MySharedMemory"); }
~shm_remove(){ boost::interprocess::shared_memory_object::remove("MySharedMemory"); }
} remover;
//Create a new segment with given name and size
boost::interprocess::managed_shared_memory segment(boost::interprocess::create_only,
"MySharedMemory", 65536);
//Initialize shared memory STL-compatible allocator
const ShmemAllocator allocator(segment.get_segment_manager());
ShmVector* v = segment.construct<ShmVector>("ShmVector")(allocator);
v->push_back(1); v->push_back(2); v->push_back(3);
//Launch child process
std::string s(argv[0]); s += " child ";
if(0 != std::system(s.c_str()))
return 1;
} else { // Child process
//Open the managed segment
boost::interprocess::managed_shared_memory segment(
boost::interprocess::open_only, "MySharedMemory");
//Find the vector using the c-string name
ShmVector *v = segment.find<ShmVector>("ShmVector").first;
for (const auto& i : *v) {
std::cout << i << " ";
}
std::cout << std::endl;
}
}
std
документацию библиотеки. Однако, учитывая распространенностьg++
иlibstdc++
, я был бы удивлен, если бы Boost явно не предупредил вас о несовместимости. - person Alex Chamberlain   schedule 08.03.2013resize
использовать вектор. Я обнаружил, что это функция, которая на самом деле предъявляет наибольшие требования к связанным типам. - person alfC   schedule 05.08.2017