是否可以将std :: vector放到共享内存中?

Ser*_*gey 15 c++ stl

我想使用CreateFileMapping()windows API函数在共享内存中创建std :: vector.我知道如何创建共享内存并管理它,但是如何将std :: vector放到内存中的固定地址?我不能在我的情况下使用boost或其他库,我正在使用CBuilder ++ 2010.我认为可能会使用一个变体

std::vector<int> myVec; 
myVec *mv;
mv = shared_memory_addr ?
Run Code Online (Sandbox Code Playgroud)

但是我如何检测向量的实际大小以调整内存大小?

Joh*_*nck 7

我将使用Boost.Interprocess,它解释了如何做到这一点:http: //www.boost.org/doc/libs/1_38_0/doc/html/interprocess/quick_guide.html#interprocess.quick_guide.qg_interprocess_container

请注意,这不使用std::vector<>,这不适用于共享内存使用,因为它通常以三个指针(开始,结束,容量或某些等价物)的形式实现,并且地址在进程之间会有所不同.所以Boost.Interprocess有自己的vector类,它是专为你想要做的而构建的.


Ale*_*ler 5

实际上,您必须同时执行这两项操作:使用placement new std::vector在共享内存中构造实例,并使用自定义分配器使向量也将其数据放在共享内存中.

请记住,您需要同步对向量的任何访问(除非您只需要读访问权限) - std::vector通常不是线程安全的,并且不声明其任何成员volatile,这使得同时访问编译器的范围 - 如它发生在共享内存区域 - 非常危险.

......毕竟,我不会这样做.共享内存是一个非常低级,非常棘手的概念,它不适合高级数据容器,例如std::vector,在某种语言中(从cpp03开始)不能为并发问题提供良好的内置解决方案,这是不知道存在共享内存之类的东西.

...它甚至可能触发未定义的行为:虽然std::vector通常使用它allocator来为其元素获取存储,但是(据我所知)允许分配更多内存(即用于内部目的,无论可能是什么)使用malloc或任何其他分配策略(我认为微软的std::vector实现在调试版本中实现了这一点)......这些指针只对内存映射的一方有效.

为了避免这种情况std::vector,我只是在预先在映射范围内分配足够的内存,并使用一个简单的计数器来保持有效元素的数量.那应该是安全的.

  • 并且您需要确保映射出现在同一地址.关于同步的好点. (2认同)

Ada*_*itz 1

使用placement new 在共享内存中构造一个向量。您还需要一个向量分配器,以便它可以使用共享内存来存储其元素。如果向量只是存储 int,并且您可以将共享内存部分放在每个进程中的相同虚拟地址处,那么这可能会起作用。