$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
Subject: Re: [Boost-users] Help with custom classes PLEASE!!
From: Daniel Veneros (dann.vd_at_[hidden])
Date: 2010-02-04 14:38:12
Hi, thanks for all the help, everything is working perfect now.
I have another question, I need to access the shared memory segment from
several process and all at the same time. I tried to use pthreads but that
didn't work.
I was looking at boost::interprocess threads but I'm not sure how to
implement the mutex.
this is the code I have:
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/containers/vector.hpp>
#include <boost/interprocess/containers/string.hpp>
#include <boost/interprocess/containers/map.hpp>
#include <boost/interprocess/allocators/allocator.hpp>
#include <cstdlib>
#include <string>
#include <iostream>
#include <map>
#include <sstream>
using namespace boost::interprocess;
typedef managed_shared_memory::segment_manager SegmentManager;
typedef allocator<void, SegmentManager> VoidAllocator;
typedef allocator<char, SegmentManager> CharAllocator;
typedef basic_string<char, std::char_traits<char>, CharAllocator>
BasicString;
class Action
{
    int id;
    BasicString task;
public:
    Action(int num, const char *name, const VoidAllocator &void_alloc)
            :id(num), task(name,void_alloc)
            {}
            void setId(int num);
            void setTask(BasicString newTask);
            int getId();
};
int Action::getId() {
    return id;
}
void Action::setId(int num) {
    id = num;
}
void Action::setTask(BasicString newTask) {
    task = newTask;
}
typedef allocator<Action, SegmentManager> ActionAllocator;
typedef std::pair<const BasicString, Action> MapValueType;
typedef std::pair<BasicString, Action> MovableToMapValueType;
typedef allocator<MapValueType, SegmentManager> MapValueTypeAllocator;
typedef map<BasicString, Action, std::less<BasicString>,
MapValueTypeAllocator> MyMap;
int main(int argc, char** argv) {
    //Remove shared memory on construction and destruction
    struct shm_remove {
        shm_remove() {shared_memory_object::remove("MySharedMemory"); }
        ~shm_remove() {shared_memory_object::remove("MySharedMemory"); }
    }remover;
    managed_shared_memory segment(create_only, "MySharedMemory", 65536);
    VoidAllocator alloc_inst(segment.get_segment_manager());
   MyMap *myMap = segment.construct<MyMap>("Map"
)(std::less<BasicString>(),alloc_inst);
    std::string keyword;
    std::string helper;
    int i=0;
    for(int adder = 0; adder<=1000; adder++)
    {
        keyword = "Hello";
        std::stringstream out;
        out << adder;
        helper = out.str();
        keyword = keyword + helper;//Creates a string "Hello" + adder
        BasicString key(keyword.c_str(), alloc_inst);//string to BasicString
        Action action(i,"Hello", alloc_inst);
        MapValueType value(key, action);
        myMap->insert(value);
        i++;
    }
How do I have to set the mutex??
Thanks!
Dann
On Wed, Feb 3, 2010 at 11:24 AM, Steven Watanabe <watanabesj_at_[hidden]>wrote:
> AMDG
>
>
> Daniel Veneros wrote:
>
>> Thanks,
>>
>> I fixed some things and its running now.
>> What I don't know how to do is to declarate/allocate a custom class..
>> I got this:
>>
>> typedef managed_shared_memory::segment_manager SegmentManager;
>>
>> typedef allocator<char, SegmentManager> CharAllocator;
>>
>> typedef basic_string<char, std::char_traits<char>, CharAllocator>
>> BasicString;
>>
>> typedef allocator<int, SegmentManager> IntAllocator;
>>
>>
>> class Action
>> {
>>    int id;
>>    BasicString task;
>> public:
>>    Action(int num, const char *name, const VoidAllocator &void_alloc)
>>            :id(num), task(name,void_alloc)
>>            {}
>>            void setId(int num);
>>            void setTask(BasicString newTask);
>> };
>>
>> void Action::setId(int num) {
>>    id = num;
>> }
>>
>> void Action::setTask(BasicString newTask) {
>>    task = newTask;
>> }
>>
>>
>> Now... how should I allocate the "Class" object??
>> Any Idea? Thanks!!
>>
>>
>
> I assume that by Class you mean the Action class?
> If this class is used at the top level, you can use
> managed_shared_memory::construct.  If you want
> to use an allocator with it, the commands are
>
> allocator<Action, SegmentManager> alloc(...);
> // allocate memory
> Action* action = alloc.allocate(1);
> // construct an object using placement new
> new (action) Action(12, "action", ...);
>
> In Christ,
> Steven Watanabe
>
> P.S.  Please send messages like this to boost-users rather than directly to
> me.
>
>