|
Boost Users : |
Subject: [Boost-users] Mutex synchronised wrapper class for boost::interprocess shared memory vector of strings
From: Riskybiz (riskybizLive_at_[hidden])
Date: 2013-06-18 10:28:52
I'm trying to write a wrapper class in C++ to give mutex synchronised
interprocess access to a shared memory vector of strings. This is my first
foray into boost::interprocess and allocators are proving something of a
mystery.
Is anyone able to see why on compilation I get the error:
error C2512: 'boost::interprocess::allocator::allocator' : no appropriate
default constructor available C:\Program Files
(x86)\Boost\boost_1_53_0\boost\container\string.hpp
#ifndef SHARED_MEMORY_WRAPPER_H//if not defined already
#define SHARED_MEMORY_WRAPPER_H//then define it
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/containers/vector.hpp>
#include <boost/interprocess/containers/string.hpp>
#include <boost/interprocess/allocators/allocator.hpp>
#include <boost/interprocess/sync/named_mutex.hpp>
using namespace boost::interprocess;
class SharedMemoryWrapper
{
public:
SharedMemoryWrapper(const std::string &name, bool server) : m_name(name),
m_server(server)
{
if (server)
{
named_mutex::remove("named_mutex");
shared_memory_object::remove(m_name.c_str());
//Create shared memory
managed_shared_memory m_segment(create_only, m_name.c_str(),
10000);
//Create allocators
CharAllocator charallocator(m_segment.get_segment_manager());
StringAllocator stringallocator(m_segment.get_segment_manager());
//This string is in only in this process (the pointer pointing to
the
//buffer that will hold the text is not in shared memory).
//But the buffer that will hold "this is my text" is allocated from
//shared memory
MyShmString mystring(charallocator);
mystring = "this is my text";
//This vector is fully constructed in shared memory. All pointers
//buffers are constructed in the same shared memory segment
//This vector can be safely accessed from other processes.
MyShmStringVector *sharedSegmentVector =
m_segment.construct<MyShmStringVector>("sharedSegmentVector")(stringallocato
r);
sharedSegmentVector->push_back(mystring);
}
else
{
//Open the shared segment
managed_shared_memory m_segment(open_only, name.c_str());
//Find the vector using the c-string name and open it
MyShmStringVector *sharedSegmentVector =
m_segment.find<MyShmStringVector>("sharedSegmentVector").first;
}
m_mutex = new named_mutex(open_or_create, "named_mutex");
}
~SharedMemoryWrapper()
{
if (m_server)
{
named_mutex::remove("named_mutex");
//Destroy the vector from the managed_shared_memory
m_segment->destroy_ptr(sharedSegmentVector);//This will free all
strings that the vector contains
m_segment->destroy<MyShmStringVector>("sharedSegmentVector");//Destroy the
vector
//Is it necessary to destroy the allocators here?
//Remove the managed_shared_memory; this may fail if the memory does
not exist or is mapped or opened by another process
shared_memory_object::remove(m_name.c_str());
}
delete m_mutex;
delete m_segment;
}
//Writer
void push(const std::string & in)
{
scoped_lock<named_mutex> lock(*m_mutex);
MyShmString inStr = in.c_str();
sharedSegmentVector->push_back(inStr);
}
//Reader function yet to be coded. Needs to return a vector containing a
subset range of elements from the shared-memory-vector.
private:
//Typedefs
typedef boost::interprocess::allocator<char,
managed_shared_memory::segment_manager> CharAllocator;
typedef boost::interprocess::basic_string<char, std::char_traits<char>,
CharAllocator> MyShmString;
typedef boost::interprocess::allocator<MyShmString,
managed_shared_memory::segment_manager> StringAllocator;
typedef boost::interprocess::vector<MyShmString, StringAllocator>
MyShmStringVector;
bool m_server;
std::string m_name;
managed_shared_memory *m_segment;
MyShmStringVector *sharedSegmentVector;
named_mutex *m_mutex;
};//class
#endif//header guard
With thanks,
Riskybiz
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net