Я создал 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;
};
Любая помощь очень ценится, Благодаря
спасибо за ваш ответ, но как узнать, находится ли очередь в выделенной памяти? –
он должен оставаться в docs, кстати, вы можете попробовать фиксированный массив, такой как int queue [20]; вместо boost :: deque, чтобы увидеть, есть ли там проблема – VaSaKed
docs ?? да, фиксированный массив работает нормально. –