boost::interprocess

Тема в разделе "LANGS.C", создана пользователем valhalla, 17 мар 2011.

  1. valhalla

    valhalla New Member

    Публикаций:
    0
    Регистрация:
    11 июн 2010
    Сообщения:
    9
    Привет всем!
    Хочется странного: есть процесс, создающий boost::interprocess::managed_shared_memory и размещающий там смартпоинтеры на объекты(в листинге назвал my_type), которые тоже размещаются в общей памяти. Так же есть другие процессы, которые должны получать доступ к вектору на чтение и запись.
    Код процесса, создающего вектор:

    Код (Text):
    1. #include <boost/interprocess/managed_shared_memory.hpp>
    2. #include <boost/interprocess/allocators/allocator.hpp>
    3. #include <boost/interprocess/containers/string.hpp>
    4. #include <boost/interprocess/containers/vector.hpp>
    5. #include <boost/interprocess/sync/named_mutex.hpp>
    6. #include <boost/interprocess/sync/scoped_lock.hpp>
    7. #include <boost/interprocess/allocators/node_allocator.hpp>
    8. #include <boost/interprocess/allocators/adaptive_pool.hpp>
    9.  
    10. typedef boost::interprocess::managed_shared_memory::segment_manager                       segment_manager_t;
    11. typedef boost::interprocess::node_allocator<void, segment_manager_t>                      void_allocator;
    12. typedef boost::interprocess::node_allocator<char, segment_manager_t>                      char_allocator;
    13. typedef boost::interprocess::basic_string<char, std::char_traits<char>, char_allocator>   char_string;
    14.  
    15. namespace ipc = boost::interprocess;
    16.  
    17. typedef vm::My_type my_type;
    18. typedef std::tr1::shared_ptr <my_type> my_type_ptr;
    19.  
    20. typedef ipc::node_allocator<machine_ptr, segment_manager_t>                                           my_type_allocator;
    21. typedef ipc::vector<machine_ptr, machine_allocator>                                                         my_type_vector;
    22. typedef boost::container::containers_detail::vector_iterator< ipc::offset_ptr <my_type_ptr> > my_type_it;
    23.  
    24. //Самое интересное
    25.  
    26. boost::interprocess::shared_memory_object::remove("MySharedMemory");
    27. boost::interprocess::managed_shared_memory segment(boost::interprocess::create_only,"MySharedMemory", 65536);
    28.  
    29. void_allocator _alloc_inst(segment.get_segment_manager());
    30. my_type_vector* my_types_vector = segment.construct<my_type_vector>("my_type_vector")(_alloc_inst); // создаем этот вектор, с нужным аллокатором.
    Процесс, получающий доступ к вектору
    Код (Text):
    1. ipc::managed_shared_memory segment(boost::interprocess::open_only,"MySharedMemory");
    2. void_allocator _alloc_inst(segment.get_segment_manager());
    3. my_type_vector* my_types_vector = segment.find<my_type_vector>("my_type_vector").first; // вот на этом падает
    Насколько я понял, в моем случае нужно использовать node_allocator, так как есть несколько процессов. С ним процесс падает на строке my_type_vector* my_types_vector = segment.find<my_type_vector>("my_type_vector").first; Если использовать boost::interprocess::allocator то все работает, но местами странно.

    Работает все это под Linux, компилируется GCC 4.4 с Boost 1.42. Использование Mutex убрал для наглядности.
    В чем может быть проблема и как её решить?
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    valhalla

    Попробуй с последним бустом. Осенью в 1.45 в interprocess было пофикшено мульярт багов (пруф). Ща как раз 1.46.1 только что вышел.