ドキュメントでは、boost::interprocess
コンテナを共有メモリに格納するための要件として次のように述べられています。
- STL コンテナーは、アロケーターで割り当てられたメモリが同じ型の他のアロケーターで割り当て解除できると想定しない場合があります。すべての allocators オブジェクトは、1 つのオブジェクトで割り当てられたメモリを他のオブジェクトで割り当て解除できる場合にのみ等しい必要があり、これは
operator==()
実行時にのみテストできます。 - コンテナーの内部ポインターは型である必要があり、コンテナーは生のポインターである
allocator::pointer
と想定しない場合があります。allocator::pointer
allocator::construct
すべてのオブジェクトは、関数と関数を介して構築/破棄する必要がありallocator::destroy
ます。
-std=c++11 (およびブースト 1.53) で gcc 4.7.1 を使用しています。以下に定義された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;
}
}