|
Boost Users : |
From: Pataki Szilard (ceelurd_at_[hidden])
Date: 2006-08-01 04:19:15
Hello,
I have a problem retrieving objects from a map placed in shared
memory. I have two processes:
proc#1: creates the shared memory, puts a map into it and populates it
with objects
proc#2: connects to the shared memory and tries to read out the
objects from the map
Whenever I try to read out the objects from the map, I get zeroes for
the internal members (a, b).
The class definition for the objects:
--------------------------------------------------
class ShmNode
{
private:
int a;
int b;
public:
ShmNode();
ShmNode(int newa, int newb);
~ShmNode();
void set(int newa, int newb);
int getA();
int getB();
};
--------------------------------------------------
I'm posting the source codes for the two programs. I removed the
synchronization stuff with semaphores for the sake of clarity:
Proc#1:
--------------------------------------------------
#include <boost/shmem/named_shared_object.hpp>
#include <boost/shmem/allocators/allocator.hpp>
#include <boost/shmem/containers/vector.hpp>
#include <boost/shmem/containers/map.hpp>
#include <boost/shmem/sync/named_semaphore.hpp>
#include <iostream>
#include "../shmem/ShmNode.hpp"
typedef std::pair<
const int,
ShmNode*>
MyPair;
typedef boost::shmem::allocator <
MyPair,
boost::shmem::named_shared_object::segment_manager>
MyAlloc;
typedef boost::shmem::map<
const int,
ShmNode*,
std::less<const int>,
MyAlloc>
MyMap;
int main()
{
boost::shmem::named_shared_object segment;
segment.create("/myshmem", 20000);
MyAlloc nodesAlloc(segment.get_segment_manager());
std::less<const int> comparator;
MyMap *table = segment.construct<MyMap>("table")(comparator, nodesAlloc);
MyPair myPair1(1, new ShmNode(1,2));
MyPair myPair2(2, new ShmNode(3,4));
MyPair myPair3(3, new ShmNode(5,6));
table->insert(myPair3);
table->insert(myPair1);
table->insert(myPair2);
return 0;
}
--------------------------------------------------
Proc#2
--------------------------------------------------
/* same includes */
/* same typedefs */
int main()
{
boost::shmem::named_shared_object segment;
segment.open("/myshmem");
MyMap *table = segment.find<MyMap>("table").first;
std::cout << "table size: " << table->size() << std::endl;
MyMap::iterator iter;
for (iter = table->begin(); ; iter++)
{
if (iter == table->end())
break;
std::cout << iter->second->getA() << " " << iter->second->getB() <<
std::endl;
}
return 0;
}
--------------------------------------------------
The problem once again: in proc#2, iter->second->getA() and
iter->second->getB() return 0. If I put the same loop into proc#1, the
correct values are returned. As a further hint, the size of the map
object in proc#2 is returned correctly (=3).
What am I doing wrong?
Regards,
Szilard
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