写入共享内存队列时出现隔离错误

Segfault on writing to a Shared Memory Queue

本文关键字:隔离 错误 队列 共享 内存      更新时间:2023-10-16

我使用 boost 托管共享内存在共享内存上创建了 boost deque。我有一个进程(进程 A)将数据推送到队列的后面,另一个进程(进程 B)从队列的前面读取并弹出前面。

我的进程 A 可以毫无问题地将数据推送到队列中。但是当我启动进程 B 时,它会在读取队列前面的那一刻出现段错误。进程 B 可以正确读取队列大小,只有当我从队列中读取或弹出元素时,它才会出现段错误。

进程 A 创建共享内存并构造队列对象。当我的进程 B 找到构造的对象时。

我的共享记忆队列是,

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;
};

任何帮助都非常感谢,谢谢

如果您可以读取队列的大小,但不能读取其 ellements,那么该队列可能只是一个处理程序并将其 ellement 存储在其他地方。您确定boost::interprocess::deque < int > queue;使用您的共享内存来分配其配置吗?