问题标签 [boost-interprocess]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
581 浏览

c++ - 如何在 Boost.Interprocess 中将参数传递给 manage_shared_memory.construct()

我已经盯着 Boost.Interprocess 文档看了好几个小时,但仍然无法弄清楚这一点。在文档中,他们有一个在共享内存中创建向量的示例,如下所示:

现在,我明白了这一点。我被卡住的是如何传递第二个参数segment.construct()来指定元素的数量。进程间文档给出了construct()as的原型

但是当我尝试

我得到编译错误。

我的问题是:

  1. 谁实际上是从对象的构造函数传递参数par1, par2segment.construct,例如vector?我的理解是正在传递模板分配器参数。那是对的吗?
  2. alloc_inst除了在共享内存中创建的对象的构造函数所要求的之外,我如何添加另一个参数?

除了简洁的 Boost 文档之外,几乎没有关于此的信息。

0 投票
2 回答
2607 浏览

c++ - boost iostream 映射文件和 boost 进程间映射文件之间有区别吗?

我想在内存中创建一个映射的二进制文件;但是我不确定如何创建要映射到系统的文件。我多次阅读文档并意识到有 2 个映射文件实现,一个在 iostream 中,另一个在进程间。

你们对如何将映射文件创建到共享内存有任何想法吗?我试图让多线程程序读取以二进制文件格式编写的大型双精度数组。另外 iostream 和进程间映射文件有什么区别?

0 投票
2 回答
506 浏览

c++ - Boost.MultiIndex:有没有办法在两个进程之间共享对象?

我有一个大约 10Gb 的 Boost.MultiIndex 大数组。为了减少读取,我认为应该有一种方法将数据保存在内存中,并且另一个客户端程序将能够读取和分析它。

组织它的正确方法是什么?

数组看起来像:

欢迎任何想法。

亲切的问候阿尔曼。

编辑: RAM 和内核数量不受限制。目前我有一个 16Gb 和 8 核。

更新

我在 Boost.Users 论坛上问的同样的问题,我从 Joaquín M López Muñoz(Boost.MultiIndex 的开发者)那里得到了答案。答案是Yes。可以使用 Boost.Interprocess 在进程之间共享 multi_index。有关更多详细信息,您可以在此链接中查看

0 投票
2 回答
1575 浏览

c++ - C++ 分配器,特别是将构造函数参数传递给使用 boost::interprocess::cached_adaptive_pool 分配的对象

这是一个令人尴尬的问题,但即使是 boost.interprocess 提供的编写良好的文档也不足以让我弄清楚如何做到这一点。

我拥有的是一个cached_adaptive_pool分配器实例,我想用它来构造一个对象,传递构造函数参数:

这很可能是我在一般情况下如何使用分配器对象方面的失败。但无论如何,我看不到如何使用这个特定的分配器,通过cached_adaptive_pool中指定的接口将构造函数参数传递给我的对象。

cached_adaptive_pool有方法:void construct(const pointer & ptr, const_reference v)但我不明白这意味着什么,我找不到使用它的例子。

我的头整天都在模板中游泳,所以即使答案很明显,也将不胜感激。

0 投票
0 回答
1136 浏览

c++ - Boost::Interprocess Container Container Resizing No Default Constructor

在梳理了 Boost::Interprocess 文档和 Google 搜索之后,我想我已经找到了问题的原因/解决方法。据我了解,我发现的一切似乎都在暗示这一点,但并没有说“这样做是因为……”。但是,如果有人可以验证这一点,我将不胜感激。

我正在编写一系列类,这些类表示存储在内存中的大量信息查找,以便在并行化应用程序中实现快速性能。由于数据的大小和同时在一台机器上运行的多个进程,我们使用 Boost::Interprocess 共享内存来拥有结构的单个副本。

我查看了 Boost::Interprocess 文档和示例,它们为共享内存字符串、字符串向量、int 向量向量等 typedef 类。当他们在示例中“使用”它们时,他们只是通过分配器构造它们,也许插入他们在其他地方构建的一项。喜欢这个页面: http: //www.boost.org/doc/libs/1_42_0/doc/html/interprocess/allocators_containers.html

因此,按照他们的示例,我为共享内存类创建了一个带有 typedef 的头文件:

然后对于我的一个查找表类,它的定义如下:

但是当我编译它时,我得到了错误: 'boost::interprocess::allocator<T,SegmentManager>::allocator' : no appropriate default constructor available

这是由于对resize()矢量对象的调用。因为这些allocator类型没有空的构造函数(它们采用 a const segment_manager_t &)并且它试图为每个位置创建一个默认对象。所以为了让它工作,我必须得到一个分配器对象并传递一个默认值对象resize。像这样:

这是最好/正确的方法吗?或者我错过了什么。

谢谢!

0 投票
1 回答
601 浏览

c++ - boost::interprocess::message_queue 在 Visual C++ 的发布模式下停止工作

我正在使用 boost::interprocess::message_queue 和 VC++(在 Microsoft Visual Studio 2005 中)。它在调试模式下正常工作。然后当我在发布模式下编译我的程序时它停止工作,每次我调用“try_send”它都会返回false。我不明白发布和调试模式之间的设置可能是什么不同,这会使队列停止工作。

0 投票
1 回答
4208 浏览

c++ - Boost::进程间共享内存总线错误

我在使用 Open-MPI 1.3.3 的集群上使用 CentOS 5.4 x86_64 和 Boost 1.42.0。我正在编写一个共享库,它使用共享内存来存储大量数据供多个进程使用。还有一个加载器应用程序,它将从文件中读取数据并将它们加载到共享内存中。

当我运行加载器应用程序时,它会确定准确存储数据所需的内存量,然后增加 25% 的开销。对于几乎每个文件,它将超过 2 gigs 的数据。当我使用 Boost 的进程间库发出内存请求时,它说它已成功保留了请求的内存量。但是当我开始使用它时,我得到一个“总线错误”。据我所知,总线错误是访问内存段可用范围之外的内存的结果。

所以我开始研究 Linux 上的共享内存是怎样的,以及检查什么以确保我的系统配置正确以允许大量共享内存。

  1. 我查看了“文件” /proc/sys/kernel/shm*
    • shmall- 4294967296(4 Gb)
    • shmmax- 68719476736(68 Gb)
    • shmmni- 4096

  2. 我调用了ipcs -lm命令:

据我所知,这些设置表明我应该能够为我的目的分配足够的共享内存。所以我创建了一个在共享内存中创建大量数据的精简程序:

用以下行编译它:

然后使用以下输出运行它(经过编辑使其更小):

如果您使用 a 参数运行程序(任何都可以,只需要增加argc),它会预先分配向量,但仍会在相同的数组索引处导致总线错误。

/dev/shm我使用以下ls -ash /dev/shm命令检查了“文件”的大小:

就像我的原始应用程序一样,分配的共享内存的大小上限为 2 gigs。鉴于它“成功”分配了 2352000000 字节的内存,以 GB 为单位(使用 1024*1024*1024)它应该是 2.19 Gb。

当我运行我的实际程序以使用 MPI 加载数据时,我得到这个错误输出:

我真的不知道该去哪里。有人对尝试什么有任何建议吗?


发布到 Boost 错误记录: https ://svn.boost.org/trac/boost/ticket/4374

0 投票
2 回答
2901 浏览

c++ - boost::interprocess 准备好迎接黄金时段了吗?

我正在研究一个由内存映射文件支持的线程安全队列,该文件大量使用了 boost 进程间。我将它提交给代码审查,一位比我在这个星球上拥有更多年经验的开发人员说他不觉得 boost::interprocess 已经“准备好迎接黄金时间”,我应该直接使用 pthreads。

我认为这主要是FUD。我个人认为重新实现诸如 upgradable_named_mutex 或 boost::interprocess::deque 之类的东西是非常荒谬的,但我很想知道其他人的想法。我找不到任何数据来支持他的说法,但也许我只是不知情或幼稚。Stackoverflow 赐教!

0 投票
2 回答
1011 浏览

c++ - C ++ BOOST:Windows共享内存get_size()返回零

以下来自官方 BOOST 文档。为什么我在调用时总是得到零大小region.get_size()?我究竟做错了什么?

0 投票
1 回答
1007 浏览

c++ - Boost::Interprocess 与复杂的嵌套类

我想我终于掌握了 boost:interprocess 库的基础知识,并且在处理包含一些成员变量都是标准数据类型的相对简单的类时,我一直在成功地使用它。

但是,我现在面临着将一个相当复杂的类推到进程间共享内存中的问题,而且我一点运气都没有。我希望这里有人可以提供帮助(或者可以引导我寻求替代解决方案)。将其简化为我希望的基础知识,我有以下几点:

我需要做的是在进程间内存空间中创建一个 SharedClass 对象的向量,以便多个进程可以访问数据。无论我尝试什么,我似乎都找不到解决方案。似乎应该有一种更简单的方法,而不是让每个成员变量成为进程间版本(interprocess::vector、interprocess::string、offset_ptr 等),但也许不是。即便如此,我也不确定如何处理所有分配器等,更不用说 GSL 库结构了。

帮助!