29 Ekim 2017 Pazar

interprocess allocator Sınıfı

Giriş
Şu satırı dahil ederiz.
#include <boost/interprocess/allocators/allocator.hpp>
Şu satırı dahil ederiz.
namespace bip = boost::interprocess;
Bu sınıf std::vector gibi nesnelere allocator olarak geçilebilir.

Tanımlama - char + managed_shared_memory
Şöyle yaparız.
typedef bip::allocator<char, bip::managed_shared_memory::segment_manager>
 char_alloc;
Tanımlama - void  + managed_shared_memory
Şöyle yaparız.
using UniversalAllocator = bip::allocator
    < void
    , bip::managed_shared_memory::segment_manager >;
Tanımlama - T + managed_shared_memory
Şöyle yaparız.
// allocator for allocating memory from the shared memory
typedef bip::allocator<T, boost_ipc::managed_shared_memory::segment_manager>
 ShmemAlloc;
Tanımlama - Foo + managed_mapped_file
Şöyle yaparız.
struct Foo {
  ...
};

// declare the memory mapped file
boost::interprocess::managed_mapped_file mmf;

// declare the allocator
typedef bip::allocator< Foo, bip::managed_mapped_file::segment_manager > mmf_allocator;
Constructor - segment_manager
Örnek
Şöyle yaparız.
// create segment and corresponding allocator
bip::managed_shared_memory segment(bip::open_or_create, "MySharedMemory", 65536);
shm::char_alloc char_alloc(segment.get_segment_manager());

Örnek
Elimizde şöyle bir kod olsun.
namespace Shared {
  namespace bip = boost::interprocess;

  using Segment = bip::managed_shared_memory;
  using Manager = Segment::segment_manager;
  template <typename T> 
  using Alloc = bip::allocator<T, Manager>;

  void remove(char const* name) { bip::shared_memory_object::remove(name); }

  using bip::create_only;
}
Bir allocator yaratmak için şöyle yaparız.
using namespace Shared;

Shared::remove("MySharedMem");
auto memory = Segment(create_only, "MySharedMem", 65536);

using A = Alloc<char>;
A alloc(memory.get_segment_manager());
Daha sonra allocator tipi std::vector'ün kullanacağı allocator tipi olarak tanıtılır.
template <typename Alloc>
struct MyType {
  using allocator_type = typename Alloc::template rebind<char>::other;

  explicit MyType(size_t aSize, Alloc alloc = {}) : mData(aSize, alloc) {}

private:
  std::vector<char, Alloc> mData;
};
Şöyle yaparız.
auto* pMyType = memory.find_or_construct<MyType<A>>("data")(1024,
  memory.get_segment_manager());


Hiç yorum yok:

Yorum Gönder