2013-11-06 2 views
1

Я создал boost deque в общей памяти, используя расширенную управляемую общую память. У меня есть один процесс (процесс A), который подталкивает данные к задней части очереди и другой процесс (процесс B), который читается с передней стороны очереди и выталкивает фронт.Segfault при записи в очередь общей памяти

Мой процесс A может передавать данные в очередь без каких-либо проблем. Но когда я начинаю свой процесс B, он segfaults, когда он читает фронт очереди. процесс B может корректно считывать размер очереди, он segfaults только тогда, когда я читаю или вывожу элемент из очереди.

Процесс A создает общую память и создает объект очереди. Хотя мой процесс B находит построенный объект.

Мои SharedMemQueue есть

struct QueueType 
{  
    boost::interprocess::interprocess_mutex mutex; 
    boost::interprocess::interprocess_condition signal; 
    boost::interprocess::deque <int> queue; 
}; 


class ShmQueue 
{ 
public: 
    ShmQueue (std::string name) 
    : _shm_name (name) 
    { 
    } 
    ~ShmQueue () 
    { 
     Deinit(); 
    } 
    bool Init (bool value = false) 
    { 
     bool result (false); 
     try 
     { 
      if (value) 
      { 
       shared_memory_object::remove (_shm_name.c_str()); 
       _shm_mem = managed_shared_memory (create_only, _shm_name.c_str(), 65356); 
       _queue = _shm_mem.construct <QueueType> ("Queue")(); 
      } 
      else 
      { 
       _shm_mem = managed_shared_memory (open_only, _shm_name.c_str()); 
       _queue = _shm_mem.find <QueueType> ("Queue").first; 
      } 
     } 
     catch (interprocess_exception &e) 
     { 
      std::cout << e.what() << std::endl; 
      _queue = NULL; 
     } 
     if (_queue != NULL) 
     { 
      result = true; 
     } 
     return result; 
    } 

    bool Deinit () 
    { 
     bool result (false); 
     _shm_mem.destroy <QueueType> ("Queue"); 
     shared_memory_object::remove (_shm_name.c_str()); 
     return result; 
    } 
    void Push (int value) 
    { 
     scoped_lock <interprocess_mutex> lock (_queue->mutex); 
     if (_queue->queue.size () < 20) 
     { 
      _queue->queue.push_back (value); 
     } 
    } 

    int Pop () 
    { 
     int result (-1); 
     scoped_lock <interprocess_mutex> lock (_queue->mutex); 
     if (!_queue->queue.empty()) 
     { 
      result = _queue->queue.front(); 
      _queue->queue.pop_front(); 
     } 
     return result; 
    } 

private: 
    std::string _shm_name; 
    QueueType * _queue; 
    managed_shared_memory _shm_mem; 
}; 

Любая помощь очень ценится, Благодаря

ответ

1

Если вы можете прочитать размер очереди, но не его ellements, чем его вероятно, что очереди просто обработчик и хранит свои эльфы где-то в другом месте. Вы уверены, что boost::interprocess::deque <int> queue; использует вашу общую память для распределения ее эльфов?

+0

спасибо за ваш ответ, но как узнать, находится ли очередь в выделенной памяти? –

+0

он должен оставаться в docs, кстати, вы можете попробовать фиксированный массив, такой как int queue [20]; вместо boost :: deque, чтобы увидеть, есть ли там проблема – VaSaKed

+0

docs ?? да, фиксированный массив работает нормально. –

Смежные вопросы