увеличить межпроцессную оболочку для распределителя - PullRequest
0 голосов
/ 29 мая 2018

У меня есть многоиндексный контейнер в shared_memory

//Create hash
typedef boost::multi_index::multi_index_container<
  My_Key,
  My_Key_hash_indices,
  bip::allocator<MyKey, bip::managed_shared_memory::segment_manager>
> MyGlobalHash;

Мне нужно в соответствии с конфигурацией использовать одно из следующего:

  1. bip :: managed_mapped_file
  2. bip :: managed_shared_memory

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

Больше кода на http://coliru.stacked -crooked.com / а / 09ea79752512fad8

1 Ответ

0 голосов
/ 30 мая 2018

Нет, тебе это не нужно.Быстрое статическое утверждение обнаруживает, что тип менеджера сегментов по умолчанию тот же:

static_assert(std::is_same<
        bip::managed_shared_memory::segment_manager,
        bip::managed_mapped_file::segment_manager>{}, "incompatible segments");

Итак, вы можете просто использовать один:

using SegmentManager = bip::managed_shared_memory::segment_manager;

Демо

Live On Coliru

#include <iostream>
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/managed_mapped_file.hpp>
#include <boost/interprocess/allocators/allocator.hpp>

namespace bip = boost::interprocess;

static_assert(std::is_same<
        bip::managed_shared_memory::segment_manager,
        bip::managed_mapped_file::segment_manager>{}, "incompatible segments");
using SegmentManager = bip::managed_shared_memory::segment_manager;

struct X {
    int i = 0;
};

#include <boost/multi_index_container.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/multi_index/ordered_index.hpp>

namespace bmi = boost::multi_index;

using Table = bmi::multi_index_container<X,
      bmi::indexed_by< bmi::ordered_unique< bmi::tag<struct byI>, bmi::member<X, int, &X::i> > >,
      bip::allocator<X, SegmentManager>
  >;

void dump(Table const& t) {
    std::cout << "table: ";
    for(auto& x : t)
        std::cout << x.i << "; ";
    std::cout << std::endl;
}

void run_test(Table& table) {
    dump(table);

    if (table.empty()) {
        table.insert({{1}, {2}, {3}, {4}});
    } else {
        table.insert({5});
    }

    dump(table);

    table.erase(table.begin());
    dump(table);
}

int main() {
    {
        bip::managed_shared_memory segment(bip::open_or_create, "msm", 10ul<<20);
        run_test(*segment.template find_or_construct<Table>("name")(segment.get_segment_manager()));
    }
    {
        bip::managed_mapped_file segment(bip::open_or_create, "mmf", 10ul<<20);
        run_test(*segment.template find_or_construct<Table>("name")(segment.get_segment_manager()));
    }
}

Печать (в моей системе), например:

table: 2; 3; 4; 
table: 2; 3; 4; 5; 
table: 3; 4; 5; 
table: 2; 3; 4; 
table: 2; 3; 4; 5; 
table: 3; 4; 5; 
...