Giriş
Şu satırı dahil ederiz.
Allocator Tanımlama
Saklanacak veri tipi için allocator tanımlanır.
strin Tanımlama Örnekleri
Tanımladığımız boost::interprocess::basic_string nesnesine allocator geçmek gerekir.
Elimizde Foo yapısı olsun.
Çok küçük bellek alanı tanımlarsak exception fırlatır. Açıklaması şöyle
Şu satırı dahil ederiz.
vector of boost::interprocess::basic_string tanımlamak için şöyle yaparız.
vector Foo isimli bir struct tutuyor olsun. Şöyle yaparız.
Şöyle yaparız.
Açıklaması şöyle.
Şöyle yaparız.
Constructor
Şöyle yaparız
Şöyle yaparız
Şöyle yaparız
Şöyle yaparız
Şöyle yaparız.
Şöyle yaparız.
Tanımladığımız allocator'ları ilklendirmek için parametre olarak geçeriz. Şöyle yaparız.
Şu satırı dahil ederiz.
#include <boost/interprocess/managed_shared_memory.hpp>
Açıklaması şöyle. Bu sınıfın kardeşi managed_mapped_file"Boost.Interprocess offers managed shared memory between processes using managed_shared_memory or managed_mapped_file. Two processes just map the same the memory mappable resource and read from and write to that object."Anladığım kadarıyla bu sınıf bir uygulama yazarken, diğerinin silmesine izin veriyor. Mutex gibi bir yapı ile kilitleyip bırakmaya gerek yok .
Allocator Tanımlama
Saklanacak veri tipi için allocator tanımlanır.
strin Tanımlama Örnekleri
Tanımladığımız boost::interprocess::basic_string nesnesine allocator geçmek gerekir.
Elimizde Foo yapısı olsun.
struct Foo;
typedef allocator<Foo, managed_shared_memory::segment_manager> salloc;
typedef boost::interprocess::basic_string<char, std::char_traits<char>,
salloc::rebind<char>::other> shared_string;
struct Foo {
int X, Y, H, W;
Foo(salloc alloc) : m_str(alloc) {}
shared_string m_str;
};
Şöyle yaparız.salloc alloc_inst(managed_shm.get_segment_manager());
Foo foo(alloc_inst);
foo.Label = "Hello World";
foo.H = 1;
foo.W = 1;
foo.Y = 1;
foo.X = 1;
// Construct a vector named "MyVector" in shared memory with argument alloc_inst
typedef vector<Foo, salloc> MyVector;
MyVector *myvector = managed_shm.construct<MyVector>("MyVector")(alloc_inst);
/foo data;
myvector->push_back(foo);
ÖrnekÇok küçük bellek alanı tanımlarsak exception fırlatır. Açıklaması şöyle
Şöyle yaparız.There's considerable initial overhead, consuming 320 bytes before anything happened.
try {
boost::interprocess::managed_shared_memory managed_shm(
boost::interprocess::create_only,
"Demo",
256);
std::cout << "success" << std::endl;
}
catch (boost::interprocess::interprocess_exception &ex) {
std::cout << ex.what() << std::endl;
}
boost::interprocess::vector tanımlama ÖrnekleriŞu satırı dahil ederiz.
#include <boost/interprocess/containers/vector.hpp>
Örnek 1vector of boost::interprocess::basic_string tanımlamak için şöyle yaparız.
typedef allocator<MyShmString, managed_shared_memory::segment_manager>
StringAllocator;
typedef vector<MyShmString, StringAllocator> MyShmStringVector;
Örnek 2vector Foo isimli bir struct tutuyor olsun. Şöyle yaparız.
struct Foo;
typedef allocator<Foo, managed_shared_memory::segment_manager> vAllocator;
Vector'u yaratmak için şöyle yaparız.// Initialize shared memory STL-compatible allocator
vAllocator alloc_inst (managed_shm.get_segment_manager());
// Construct a vector named "MyVector" in shared memory with argument alloc_inst
typedef vector<Foo, salloc> MyVector;
MyVector *myvector = managed_shm.construct<MyVector>("MyVector")(alloc_inst);
Örnek 3Şöyle yaparız.
namespace bip = boost::interprocess;
typedef unsigned char uchar;
//Typedefs of allocators and containers
typedef bip::managed_shared_memory::segment_manager segment_manager_t;
typedef bip::allocator<void, segment_manager_t> void_allocator;
typedef void_allocator::rebind<uchar>::other uchar_allocator;
typedef bip::vector<uchar, uchar_allocator> uchar_vector;
Yardımcı Sınıf
Belleği temiz yaratmak ve temizlemek için şöyle yaparız.struct shm_remove
{
shm_remove(){shared_memory_object::remove("MySharedMemory");}
~shm_remove(){shared_memory_object::remove("MySharedMemory");}
}remover;
Ayrılan Bellek Alanı Yetersiz GelirseAçıklaması şöyle.
Every time a segment is grown, the OS is free to reallocate the whole memory chunk, and then, all pointers to that memory become invalid. Then, test_vector could point to invalid memory after growing. Try mapping the segment again, this time with the open_only option and use managed_shared_memory::find to reach to your vector.Örnek
Şöyle yaparız.
void append(int value) {
try {
test_vector->push_back(value);
} catch (std::exception & e) { // Grow shared memory if out of memory
managed_shared_memory::grow(SHMEM_NAME.data(), 1000);
// Re-map the shared memory segment
segment = new managed_shared_memory(open_only, SHMEM_NAME.data());
// Find the vector object in the newly mapped shared memory segment
std::pair<ShmemVector*, size_t> return_value = segment->find<ShmemVector>
("ShmemVector");
test_vector = return_value.first;
// Append the value
test_vector->push_back(value);
}
}
Constructor
Şöyle yaparız
// Create a new segment with given name and size
managed_shared_memory segment(create_only,"MySharedMemory",65536);
construct metoduŞöyle yaparız
StringAllocator stringallocator(segment.get_segment_manager());
MyShmStringVector *myshmvector = segment.construct<MyShmStringVector>("MyVector")
(stringallocator);
Daha sonra bu vector'e string eklenebilir.std::string sName = ...;
myshmvector->push_back(sName(pBuf));
destroy metoduŞöyle yaparız
segment.destroy<MyShmStringVector>("MyVector");
find metoduŞöyle yaparız
// Find the vector using c-string name
MyShmStringVector *myvector = segment.find<MyShmStringVector>("MyVector").first;
MyShmStringVector::iterator it;
for(it = myvector->begin(); it !=myvector->end(); ++it){
...
}
find_or_construct metoduŞöyle yaparız.
auto* v = segment.find_or_construct<MyShmStringVector
>("MyVector")
(segment.get_segment_manager()).first;
get_free_memory metodouŞöyle yaparız.
std::cout << segment.get_free_memory() << std::endl;
get_segment_manager metoduTanımladığımız allocator'ları ilklendirmek için parametre olarak geçeriz. Şöyle yaparız.
//Initialize shared memory STL-compatible allocator
CharAllocator charallocator(segment.get_segment_manager());
StringAllocator stringallocator(segment.get_segment_manager());
Şöyle yaparız.Struct1Vector svector(segment.get_segment_manager());
Hiç yorum yok:
Yorum Gönder