Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 共享内存中的STL容器(Windows)_C++_Winapi_Stl_Boost Interprocess - Fatal编程技术网

C++ 共享内存中的STL容器(Windows)

C++ 共享内存中的STL容器(Windows),c++,winapi,stl,boost-interprocess,C++,Winapi,Stl,Boost Interprocess,我正在开发一个由两个进程组成的应用程序,它们必须共享一些数据结构。这些类组织在不同的库中,这些库用于不同的应用程序 我的第一次尝试是在Win32中使用,但这里的问题是我不能使用STL容器 为了寻找解决方案,我发现,如果我理解的话,我必须将类中的所有STL容器更改为“STL”Boost进程间容器 那么,是否有其他方法可以使用STL(在Windows中)共享类或结构?我们的目标是不要在我们的库中对Boost造成太多的依赖 感谢Boost.Interprocess有自己的容器类的原因是大多数当前的

我正在开发一个由两个进程组成的应用程序,它们必须共享一些数据结构。这些类组织在不同的库中,这些库用于不同的应用程序

  • 我的第一次尝试是在Win32中使用,但这里的问题是我不能使用STL容器
  • 为了寻找解决方案,我发现,如果我理解的话,我必须将类中的所有STL容器更改为“STL”Boost进程间容器
那么,是否有其他方法可以使用STL(在Windows中)共享类或结构?我们的目标是不要在我们的库中对Boost造成太多的依赖


感谢

Boost.Interprocess有自己的容器类的原因是大多数当前的实现在分配器方面不完全支持该标准

Boost.Interprocess容器类是标准容器的完全兼容实现,因此您可以使用它们作为标准容器的替代品,并在修复它们以支持标准分配器协议时切换到供应商提供的容器

我不确定我是否能比更好地解释它,但最大的问题是共享内存映射到不同虚拟地址的不同进程中,因此容器中使用的任何指针都必须是相对指针(例如,从段的开始)。标准分配器模型支持这一点,但容器也必须通过使用
allocator::pointer
而不是
T*
来支持这一点。当所有实现都修复为支持此功能时,将不再需要Boost.Interprocess容器


或者,您可以映射内存;如果这样做,那么就可以使用现有实现的容器,因为原始指针将正常工作。

我个人会避免使用共享结构方法。另一种选择是将结构的所有权授予两个过程中的一个。另一个进程将通过向第一个进程发送消息来访问它


如果您完全决定使用共享内存,那么您当然可以将其与STL一起使用。首先,您必须为您的容器创建一个自定义分配器。分配器将从共享内存块分配内存。此外,由于STL容器不是线程安全的,因此必须使用命名互斥体为容器编写同步包装。

将符合标准的STL集合与boost::interprocess一起使用的真正问题是,该标准明确允许集合假定相同类型的分配器是等效的,分配器不需要任何存储状态,指针类型可以忽略,而可以使用t*

boost::进程间文档比我能更好地解释这一点,但我的总结是:

  • C++标准允许无状态或状态分配器< /LI>
  • 即使指针指定另一个类型
  • ,C++标准也允许使用指针*
  • 进程间需要有状态分配器支持(因此拥有的内存段可以在所有分配中使用)
  • 对于大多数用途,boost::interprocess使用替代指针类型-对于非平凡应用程序,这将是offset\u ptr
  • boost::进程间集合-map/vector/etc-(这些是当前boost::容器类型的typedef)提供了boost::进程间需要的所有这些可选实现细节

这样,即使STL当前的集合支持Booost::进程间的需求,它们可能不会,但C++的标准没有保证它们将来会继续提供这些需求。对于boost::进程间应用程序中使用的集合,唯一明智的方法是使用保证符合boost:进程间要求的boost集合—从boost::container或boost:进程间:collections开始—您需要为容器创建自定义分配器。有关它的一些解释,请参阅。