Повышение межпроцессного вектора, создание нескольких векторных указателей - PullRequest
0 голосов
/ 28 декабря 2011

Я хочу вставить общий вектор в общую карту, используя следующий код:

managed_shared_memory segment(create_only ,"MySharedMemory" ,65536);

typedef allocator<int, managed_shared_memory::segment_manager> vecAllocator;
typedef vector<int, vecAllocator> vec;
typedef std::pair<int, vec* > ValueType;
typedef allocator<ValueType, managed_shared_memory::segment_manager> ShmemAllocator;
typedef multimap<int, vec*, std::less<int>, ShmemAllocator> MyMap;

ShmemAllocator alloc_inst (segment.get_segment_manager());
vecAllocator vectorallocator (segment.get_segment_manager());


MyMap *mymap = segment.construct<MyMap>("MyMap")(std::less<int>(),alloc_inst);
vec *myvec = segment.construct<vec>("myvec")(vectorallocator);
vec *myvec1 = segment.construct<vec>("myvec1")(vectorallocator);

myvec->push_back(10);
myvec->push_back(9);
myvec->push_back(8);
myvec1->push_back(987);
myvec1->push_back(123);
myvec1->push_back(456);


for(int i = 0; i < 6; ++i){
    for(int j = 0; j<6; j++)
        mymap->insert(std::pair<int, vec*>(i, myvec));
}
for(int i = 0; i < 6; ++i){
    for(int j = 0; j<6; j++)
        mymap->insert(std::pair<int, vec*>(i, myvec1));
}

код работает .. но я хочу создать вектор без имени.то есть сделайте что-то вроде этого

vec *myvec = segment.construct<vec>(vectorallocator);
vec *myvec1 = segment.construct<vec>(vectorallocator);

, чтобы, если я поместил это в цикл, и не возникало проблем с присвоением им имен по-разному в каждом цикле.Есть ли способ сделать это?Или, по крайней мере, существует ли автоматический способ называть их по-разному в каждом цикле?

Ответы [ 2 ]

0 голосов
/ 30 декабря 2011

Ну, мой предыдущий ответ был ГЛУПЫМ ... так что вот правильный ответ. Мы должны использовать анонимный экземпляр, чтобы получить то, что я хочу.Это делается с использованием

vec *myvec = segment.construct<vec>(anonymous_instance)(vectorallocator);

, здесь это объясняется http://www.boost.org/doc/libs/1_48_0/doc/html/interprocess/managed_memory_segments.html#interprocess.managed_memory_segments.managed_memory_segment_features.anonymous

Это также объясняет некоторые другие хорошие функции.

0 голосов
/ 28 декабря 2011

, поскольку мне не нужно имя вектора, вот что я сделал.

unsigned int seconds;
srand ( time(NULL) );
seconds = rand() % 1000000;
std::stringstream buf;
buf << seconds;
vec *myvec = segment.construct<vec>((buf.str()).c_str())(vectorallocator);

и теперь у меня может быть много vec * без учета имени ..:)

это всего лишь тривиальный ответ.

...