boost::interprocess 不在共享内存副本中的容器容器
Posted
技术标签:
【中文标题】boost::interprocess 不在共享内存副本中的容器容器【英文标题】:boost::interprocess Containers of containers NOT in shared memory copy 【发布时间】:2014-11-03 09:43:41 【问题描述】:基于上一个问题boost::interprocess Containers of containers NOT in shared memory 我能够在共享内存和堆中创建对象。 我现在想要的是一个模板深拷贝函数,用于在堆之间复制一个 shm,该函数可用于独立于分配器的所有进程间向量。
#include <boost/interprocess/containers/vector.hpp>
#include <boost/interprocess/allocators/allocator.hpp>
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/range/algorithm.hpp>
#include <iostream>
#include <cassert>
template <typename T>
using BoundShmemAllocator = boost::interprocess::allocator<T, boost::interprocess::managed_shared_memory::segment_manager>;
class MyStruct
public:
MyStruct() ;
MyStruct ( int i ) : i ( i ) ;
int i;
;
template <template<typename...> class BoundShmemAllocator>
using MyStructVector = boost::interprocess::vector<MyStruct, BoundShmemAllocator<MyStruct> >;
// Variant to use on the heap:
using HeapMyStructVector = MyStructVector<std::allocator>;
// Variant to use in shared memory:
using ShmemMyStructVector = MyStructVector<BoundShmemAllocator>;
// ----> Question how to I get this working, or way not?
//template <typename T, template<typename...> class AllocatorSrc, template<typename...> class AllocatorDes>
//void copy ( boost::interprocess::vector<T, AllocatorSrc<T> > &src, boost::interprocess::vector<T, AllocatorDes<T> > &des )
void copy ( const ShmemMyStructVector &src, HeapMyStructVector &des )
des.resize ( src.size() );
typename boost::interprocess::vector<T, AllocatorSrc<T> >::const_iterator itSrc;
typename boost::interprocess::vector<T, AllocatorDes<T> >::iterator itDst;
for(itSrc = src.begin(), itDst = des.begin(); itSrc != src.end(); itDst++, itSrc++)
*itDst = *itSrc;
//
///////////////////////////////////////////////////////////////
int main()
srand ( time ( NULL ) );
// A managed shared memory where we can construct objects
boost::interprocess::managed_shared_memory segment = boost::interprocess::managed_shared_memory ( boost::interprocess::open_or_create, "MySharedMemory", 65536 );
BoundShmemAllocator<int> const shmem_alloc ( segment.get_segment_manager() );
ShmemMyStructVector *src = segment.find_or_construct<ShmemMyStructVector> ( "MyStruct" ) ( shmem_alloc );
for ( size_t i = 0; i < 5; i++ ) src->push_back(rand());
// You can have something like this working:
HeapMyStructVector des; // and also the shm stuff below
des.push_back(rand());
copy(*src, des);
std::cout << "Shmem: ";
for ( size_t i = 0; i < src->size(); i++ ) std::cout << i << ": " << src->at(i).i << (i!=src->size()-1?", ":"\n");
std::cout << "Heap: ";
for ( size_t i = 0; i < des.size(); i++ ) std::cout << i << ": " << des.at(i).i << (i!=des.size()-1?", ":"\n");
segment.destroy<ShmemMyStructVector> ( "MyStruct" );
【问题讨论】:
【参考方案1】:你为什么这么努力地推论类型推导?
template <typename Src, typename Dest>
void copy(Src const &src, Dest &des)
des.assign(src.begin(), src.end());
对我来说就像一个魅力:Live On Coliru
(关于 MSVC,我需要来自 https://svn.boost.org/trac/boost/ticket/9369 的补丁)
到评论:
通常的技巧是推导出函数模板中的参数,然后分派到您专门针对不同实际参数类型的函数对象。
在这种情况下,我仅部分专门用于向量情况:
namespace detail
template <typename Src, typename Dest> struct copier;
template <typename T, typename A1, typename A2> struct copier<
typename boost::interprocess::vector<T, A1>,
typename boost::interprocess::vector<T, A2> >
template <typename Src, typename Dest>
static void call(Src const &src, Dest &des)
des.assign(src.begin(), src.end());
;
template <typename Src, typename Dest>
void copy(Src const &src, Dest &des)
detail::copier<Src, Dest>::template call(src, des);
【讨论】:
谢谢,那就更好了 :-),但我喜欢让 boost 向量不作为具有多个复制功能的模板,例如向量的向量或其他东西...... @moresun 您可以随心所欲,但 (a) 确保参数在 可推导上下文 中,并且 (b) 不要专门化函数模板。尔格:Live On Coliru以上是关于boost::interprocess 不在共享内存副本中的容器容器的主要内容,如果未能解决你的问题,请参考以下文章
boost::interprocess 32 位和 64 位进程之间的共享内存
boost::interprocess::named_mutex 是不是需要存储在共享内存中?
使用 Boost.Interprocess 使进程等待直到资源加载到共享内存中
boost::interprocess 共享内存段函数 find() 如果段已经存在,则在启动时挂起