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@gmail.com> 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.