代码之家  ›  专栏  ›  技术社区  ›  user997112

使用互斥量和条件变量跨内存提升进程间共享向量

  •  2
  • user997112  · 技术社区  · 8 年前

    我在网上找到了这个代码( http://prakharprakhar.blogspot.co.uk/2009/12/boost-shared-memory-vector.html ),详细介绍了如何通过Boost Interprocess共享向量:

    在共享内存中写入向量

    using namespace boost::interprocess;
    
    using ShmemAllocator = allocator<int, managed_shared_memory::segment_manager>;
    using MyVector = vector<int, ShmemAllocator>
    
    int main()
    {
        shared_memory_object::remove("MySharedMemory");
    
        managed_shared_memory segment(create_only, "MySharedMemory", 65536);
    
        const ShmemAllocator alloc_inst(segment.get_segment_manager());
    
        MyVector* myVector = segment.construct<MyVector>("MyVector")(alloc_inst);
    
        for(int i = 0; i < 100; ++i)
        {
            myVector->push_back(i);
        }
    }
    

    从共享内存中的矢量读取

    int main()
    {
        using namespace boost::interprocess;
    
        using ShmemAllocator = allocator<int, managed_shared_memory::segment_manager>
        using MyVector = vector<int, ShmemAllocator>;
    
        managed_shared_memory segment(open_only, "MySharedMemory");
        MyVector* myVector = segment.find<MyVector>("MyVector").first;
    
        std::cout << "Size of shared vector: " << myVector->size() << std::endl;
    
        MyVector::iterator iter = myVector->begin();
        while(iter++ != myVector->end())
        {
            std::cout << "nvalue = " << *iter << std::endl;
        }
    
        //segment.destroy<MyVector>("MyVector");
    }
    

    但是,我想同步我的两个进程/线程。我需要一个互斥锁来防止同时访问,还需要一个条件变量来通知读卡器有数据。

    从此处阅读:

    https://www.boost.org/doc/libs/1_57_0/doc/html/interprocess/synchronization_mechanisms.html

    我看到典型的设计是将互斥量和条件变量放置在跨内存共享的对象中。因此,我开始创建一个结构:

    struct MySharedData
    {
        MyVector vec;
        interprocess_mutex      mutex;
        interprocess_condition  cond_empty;
    }
    

    然而,Boost文档示例不需要共享内存分配器,因此我不确定是否可以简单地将MyVector放在结构中。

    如何将自定义向量分配器与“包装器”结构集成,以包含互斥体和条件变量?

    1 回复  |  直到 8 年前
        1
  •  1
  •   sehe    8 年前

    因此,我开始创建一个结构:

    struct MySharedData
    {
        MyVector vec;
        interprocess_mutex      mutex;
        interprocess_condition  cond_empty;
    }
    

    看起来神智清醒。为什么会有问题?只需添加一个构造函数来初始化向量的分配器。这可能会起作用:

    MySharedData::MySharedData(managed_shared_memory::segment_manager* sm) 
       : vec(sm) 
    {}