Segfault при записи в очередь с общей памятью

Я создал двухъядерную очередь 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;
};

Любая помощь очень ценится, спасибо


person slash_axl    schedule 06.11.2013    source источник


Ответы (1)


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

person VaSaKed    schedule 06.11.2013
comment
спасибо за ваш ответ, но как мне узнать, находится ли очередь в выделенной мне памяти? - person slash_axl; 07.11.2013
comment
он должен оставаться в документах, кстати, вы можете попробовать фиксированный массив, например int queue[20]; вместо boost::deque, чтобы увидеть, есть ли проблема - person VaSaKed; 07.11.2013