Простое приложение C++ boost::interprocess

Я хочу написать простое приложение с ускорением, которое передает строковый объект другому процессу. Он хорошо компилируется, но когда я пытаюсь распечатать строку из второго процесса, в консоль выводятся следующие сообщения, и второй процесс падает:

../boost

shared_memory_object::remove(SHARED_MEMORY_NAME);
managed_shared_memory mshm(create_only, SHARED_MEMORY_NAME,  SHARED_MEMORY_SIZE ); 
mshm.construct<string>( IP_STRING_NAME )("Message to other process");
string syscall(argv[0]);
std::system( (syscall+" &").c_str()  ); //starting second process
44_0/boost/interprocess/sync/posix/interprocess_recursive_mutex.hpp:107: void boost::interprocess::interprocess_recursive_mutex::unlock(): Утверждение `res == 0' не удалось.

первый код процесса:

shared_memory_object::remove(SHARED_MEMORY_NAME);
managed_shared_memory mshm(create_only, SHARED_MEMORY_NAME,  SHARED_MEMORY_SIZE ); 
mshm.construct<string>( IP_STRING_NAME )("Message to other process");
string syscall(argv[0]);
std::system( (syscall+" &").c_str()  ); //starting second process

второй код процесса:

managed_shared_memory mshm( open_or_create, SHARED_MEMORY_NAME, SHARED_MEMORY_SIZE  );
std::pair<string * , size_t > p= mshm.find<string>(IP_STRING_NAME);
cout<<"string is "<<*p.first<<endl;

Как я могу заставить мое приложение работать должным образом?


person avida    schedule 25.11.2010    source источник


Ответы (1)


Из вашего кода неясно, имели ли вы в виду boost::interprocess::string или std::string, но из моего нескольких часов boost::interprocess (довольно разочаровывающего...) опыта вы не хотите ни того, ни другого...

Итак, вот

Краткое руководство по работе со строками в boost::interprocess

Во-первых, вам нужно определить специальную строку:

typedef boost::interprocess::allocator<char, boost::interprocess::managed_shared_memory::segment_manager> CharAllocator; 
typedef boost::interprocess::basic_string<char, std::char_traits<char>, CharAllocator> my_string;

Во-вторых, отправляющее приложение должно использовать:

// (mshm is the managed_shared_memory instance from the question)
mshm.construct<my_string>( SOME_STRINGY_NAME )(
            "Message to other process",
            mshm.get_segment_manager());

Наконец, приложение для чтения должно:

std::pair<my_string * , size_t > p= mshm.find<my_string>(SOME_STRINGY_NAME);
cout<< "got " << p.second << " strings " << endl;
cout<< "first string is->"<<p.first->c_str()<<endl;

Примечание. Причиной всей этой сложности является это.

Ваше здоровье

person Hertzel Guinness    schedule 27.12.2010
comment
Хорошо, но я хотел иметь вектор или деку со строками в нем.. как я могу вложить это? - person Nils; 20.06.2012
comment