Я создал двухъядерную очередь Boost в общей памяти, используя управляемую общую память Boost. У меня есть один процесс (процесс A), который помещает данные в конец очереди, и другой процесс (процесс B), который читает из начала очереди и выталкивает ее вперед.
Мой процесс 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;
};
Любая помощь очень ценится, спасибо