问题标签 [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 投票
0 回答
348 浏览

c++ - 提升进程间消息队列,打开和关闭

我有两个进程,一个写入(create_only),另一个读取(open_only)。如果编写器进程正在结束,我删除队列。然而,读者能够继续执行 try_receive 并且不会引发异常或启用通知。检查队列是否存在的推荐方法是什么,我应该调用 get_max_msg 还是在进程间有一些我错过的其他调用?

0 投票
3 回答
2857 浏览

c++ - 将文件中的非连续块映射到连续的内存地址

我对使用内存映射 IO 的前景感兴趣,最好利用 boost::interprocess 中的设施来支持跨平台,将文件中的非连续系统页面大小块映射到内存中的连续地址空间。

一个简化的具体场景:

我有许多“普通旧数据”结构,每个结构都是固定长度(小于系统页面大小)。这些结构连接成一个(非常长的)流,结构的类型和位置由在流中处理它们的那些结构的值。我的目标是在要求苛刻的并发环境中最大限度地减少延迟并最大限度地提高吞吐量。

我可以通过将这些数据映射到至少是系统页面大小两倍的块中来非常有效地读取这些数据......并在读取超出倒数第二个系统页面边界的结构后立即建立一个新映射。这允许与普通旧数据结构交互的代码幸福地不知道这些结构是内存映射的……例如,可以直接使用 memcmp() 比较两个不同的结构,而不必关心页面边界。

事情变得有趣的地方在于更新这些数据流......同时(同时)读取它们。我想使用的策略受到系统页面大小粒度上的“写入时复制”的启发......本质上是写入“覆盖页面” - 允许一个进程读取旧数据,而另一个进程读取更新的数据。

虽然管理要使用的覆盖页面以及何时使用并不一定是微不足道的......这不是我主要关心的问题。我主要担心的是我可能有一个跨越第 4 页和第 5 页的结构,然后更新一个完全包含在第 5 页中的结构......在位置 6 中写入新页面......当第 5 页被“垃圾收集”时确定不再可达。这意味着,如果我将第 4 页映射到位置 M,我需要将第 6 页映射到内存位置 M+page_size... 以便能够使用现有的(非内存映射-知道)功能。

我正在尝试制定最佳策略,但我觉得文档不完整,这使我受到了阻碍。本质上,我需要将地址空间的分配从内存映射中解耦到该地址空间。使用 mmap(),我知道我可以使用 MAP_FIXED - 如果我希望明确控制映射位置......但我不清楚我应该如何保留地址空间以安全地执行此操作。我可以在没有 MAP_FIXED 的情况下为两个页面映射 /dev/zero,然后使用 MAP_FIXED 两次将两个页面映射到显式 VM 地址处的分配空间吗?如果是这样,我也应该调用 munmap() 三次吗?它会泄漏资源和/或有任何其他不良开销吗?为了使问题更加复杂,我想在 Windows 上进行类似的行为...... 有什么办法吗?如果我要妥协我的跨平台野心,是否有巧妙的解决方案?

--

感谢您的回答,Mahmoud ...我已经阅读并认为我已经理解了该代码...我已经在 Linux 下编译了它,它的行为符合您的建议。

我主要关心的是第 62 行 - 使用 MAP_FIXED。它对 mmap 做了一些假设,当我阅读我能找到的文档时,我无法确认这些假设。您将“更新”页面映射到与最初返回的 mmap() 相同的地址空间 - 我认为这是“正确的” - 即不是碰巧在 Linux 上工作的东西?我还需要假设它适用于文件映射和匿名映射的跨平台。

该示例确实使我前进...记录了我最终需要的内容可能可以通过 Linux 上的 mmap() 来实现——至少。我真正想要的是一个指向文档的指针,该文档显示 MAP_FIXED 行将像示例演示的那样工作......并且,理想情况下,从 Linux/Unix 特定 mmap() 到独立于平台的转换(Boost::interprocess ) 方法。

0 投票
1 回答
537 浏览

c++ - 如何在对象的生命周期内持有 Boost upgradable_lock?

我正在实现一对用于进程间通信的类,其中一个进程将是唯一的编写者,并且会有很多读者。一类处理阅读;一个处理写作。为了防止任何其他进程成为编写器,我想要编写器类的单个对象,它在boost::named_upgradable_mutex其整个生命周期内保持可升级的锁。为此,编写器类有一个类型的成员变量,boost::interprocess::upgradable_lock在构造对象时将其传递给互斥锁。当写入器进程写入时,它会调用写入器类的 Write() 方法,该方法应该将该锁升级为独占锁,执行写入,并以原子方式将独占锁降级为仅可再次升级。

通过遵循关于Lock Transfers Through Move Semantics的 Boost 文档,我设法在我的 writer 类的 Write() 方法中实现了第一部分 - 将锁升级为独占。但是,第二部分 - 将锁降级为可升级 - 导致类型为 boost::interprocess::upgradable_lock 的新局部变量将超出范围并在 Write() 返回时释放互斥锁。我需要将该可升级锁放回我的类的 upgradable_lock 成员变量中,以便升级功能将仅保留在我的 writer 对象中。最好的方法是什么?我唯一能想到的就是在返回之前将局部变量与我的成员变量交换。代码如下所示:

这行得通,但最后一行真的违反直觉,我花了一段时间才想到。有没有更好的办法?是否可以将降级锁直接放入我的成员变量中?另外,重用成员变量来存储降级锁是否有任何意想不到的后果?

0 投票
1 回答
4623 浏览

c++ - 使用 boost::interprocess 编译的链接器错误

我编写了一个小程序,它将 boost::interprocess::container 字符串写入共享内存并从中读取另一个。

我收到以下链接器错误:

我还尝试与以下链接:

但是这些命令都不起作用。有人可以告诉我如何编译这个简单的例子吗?

0 投票
2 回答
3150 浏览

c++ - boost::interprocess::managed_shared_memory 崩溃程序

我的目标是创建一个名为 SharedMemory 的模板单例类,它可以使用 boost::interprocess::managed_shared_memory 将给定的数据结构存储在共享内存中的映射中。

这是一个如何使用它的例子。

这是一个堆栈跟踪:

我当前的问题是程序崩溃调用mymap->begin()in getMapOfRecords()

0 投票
2 回答
11893 浏览

mysql - mysql中的同步存储过程执行

我在mysql中有一个存储过程来执行需要同步的任务,这样如果两个应用程序调用存储过程,只有一个可以访问一段代码来执行任务,让另一个被阻塞直到第一个一个完成任务。

因此,如果两个应用程序同时调用存储过程,则任务必须同步。

一种。但是Start TRANSACTIONCOMMIT没有同步执行。

湾。并且 LOCK TABLES tableA也不能在存储过程中使用以确保同步。

C。我试图在应用程序级别同步存储过程调用。我用了

boost_interprocess scoped_lock lock();

它在 boost 1.41 中运行良好

但是 boost 1.34 库不支持进程间锁定互斥锁,这在我的情况下是可用的。

有没有办法同步代码的存储过程部分,这样当同时进行两个调用时,一个在另一个被执行之前被阻塞?

(添加了以下)编辑的代码:给出一个想法,我想在存储过程的同步块中执行什么。

它获取最后分配的 id,并将其加一并检查它是否未用于其他“名称”记录。找到有效 id 后,更新最后分配的 id 记录表,然后将其与给定的“名称”相关联。

0 投票
1 回答
916 浏览

c++ - boost::进程间内存大小

我有一个managed_shared_memory对象,其中包含SharedMap定义如下的地图容器。

我的问题是我需要确定我正在使用的共享内存的大小。地图的键是一个未知大小的std::string,数据是一个未知大小的模板类型,其中每个数据的大小都会有所不同。

谁能建议我如何跟踪我正在使用的内存?

我是 boost::interprocess 的新手,所以任何建议都会有很大帮助。

0 投票
1 回答
780 浏览

c++ - boost::interprocess::map - 如何使用 basic_string 作为类型更新值

我有以下代码:

谁能给我最后一行的正确语法?最后一行给了我一个编译错误。

在此先感谢您的帮助。

0 投票
1 回答
1148 浏览

php - php和boost库IPC如何通信?

我在 php 中有客户端和服务器通过共享内存进行通信,现在我想使用 Boost.Interprocess 访问这个碎片内存对象,我该如何访问它?服务器.php:

客户端.php

我应该向 Boost 提供什么样的密钥来获取这个内存区域?

boost_client.cpp

编辑:

好吧,我在 Boost IPC library Docs 中找到了解决方案:

来自 boost Docs 的基于 XSI_KEY 的示例

0 投票
1 回答
943 浏览

c++ - 与 boost::interprocess_mutex 相比,为什么不在共享内存中使用 boost::mutex?

现在已经有一段时间在愤怒中学习和使用提升共享内存,我已经得出了一个心智模型,什么时候使用什么类型的互斥锁,看起来像这样:

我希望我原则上没有弄错,所以如果是这样,请纠正我。我的意图是推进和纠正现有代码以及我自己的不符合这张图片但我想确定的代码。

这个问题的两个部分:我认为它确实没问题,但使用 //2 毫无意义 - 在上下文中这不如 //1 好,但原因是什么?表现?

对于 //3,我猜对了吗?有人可以给出它不起作用的技术幕后原因,或者至少在什么情况下它不起作用?