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

c++ - 如何使用 boost 可升级互斥锁的示例

我有一个多线程服务器应用程序,它需要对一些共享内存进行互斥锁。

共享内存基本上是 sTL 映射等。

很多时候我只是在看地图。但是,我也需要偶尔添加它。

例如 typedef std::map MessageMap; 消息映射消息映射;boost:shared_mutex access_;

编辑:我可能会混淆不同的锁类型。

共享/升级和独占之间有什么区别。即我不明白解释。听起来如果您只想允许大量读者,那么您想要获得的只是共享访问权限。而要写入您的共享内存,您只需要升级访问权限。还是你需要独家?boost 中的解释并不明确。

是否获得了升级访问权限,因为您可能会写。但是共享意味着你肯定不会写是什么意思?

编辑:让我更清楚地解释我想要做什么。我对答案还不满意。

这里又是一个例子,但还有一个我正在使用的代码的例子。只是一个插图,而不是实际的代码。

0 投票
3 回答
17082 浏览

c++ - 如何在 C++ 中使用 boost 实现类似于信号量的功能?

我注意到 boost 似乎不支持信号量。达到类似效果的最简单方法是什么?

0 投票
1 回答
2326 浏览

c++ - 使用 boost 进程间访问共享对象的向量元素

我试图了解 boost 进程间库是如何工作的。我有一个设备类,它在向量容器中保存整数值。

在父父进程中;我在MySegmentObject段中构造了 Equipment 对象,并在该对象的构造函数中在MySegmentVector段中创建了向量。

使用子进程;我想访问创建的对象并获取向量的大小。我可以使用segment->find方法访问该对象,但是当我getSize()从访问的对象调用该方法时,它崩溃了!

我做错了什么,可能我错过了关于共享内存概念的东西。

我在 Visual Studio 2010 & boost 1.43.0 lib 上测试了代码

设备.h

设备.cpp

主文件

0 投票
1 回答
242 浏览

c++ - 使用整数标识符在共享内存上构造对象

当我查看 boost 进程间库的示例时,对象总是用字符串名称构造的。

是否可以使用整数标识符构造对象,例如

0 投票
2 回答
1255 浏览

c++ - 如何序列化 boost::function 以将其发送到 message_queue

我实际上是在尝试使用 boost::serialize 序列化 boost::function,因为我想在 boost::interprocess::message_queue 中共享它。我只看到了一种方法,那就是使用非侵入式的 boost::serialize 版本。

我还需要序列化 ​​vtable 和 functor,我没有尝试过,我不确定它是否有效。

那么有什么方法可以以适当的方式序列化 boost::function 吗?

谢谢你。

0 投票
1 回答
226 浏览

c++ - boost-interprocess 库中的问题

有人可以为我提供这个 find 方法的定义吗?

0 投票
0 回答
463 浏览

c++ - boost::interprocess::mapped_region 更改时的线程通知

当 boost::interprocess::mapped_region 中的字节使用 interprocess_condition 更改时,如何通知我。

我打开了一个文件,并正确映射了特定区域。当我轮询并打印内存时,更新已经成功。我现在希望收到有关更改的通知,而不是不断地轮询。

如何使用 interprocess_condition 通知我的线程内存已更改?

0 投票
1 回答
1515 浏览

c++ - Boost.Interprocess:如何从另一个进程中的类调用和发送数据到函数?

因此,我创建了一个适用于线程的简单类 - 您可以将任何类的任何 void 函数添加到从呈现我的类继承的类的订阅函数列表中:

您只需要订阅:

当我们处理线程时这很简单——我们总是可以调用例如 create_thread 并在其他应用程序线程中完成我们需要的所有工作。

但是,如果我们有 app1 app2 和 app3 并且您想从一个进程共享一个函数的指针并使用代理应用程序将该指针指向另一个应用程序,以便可以使用上一个进程/应用程序的参数调用它呢?

在现实生活中,如果我们有一个运行不可编辑文本字段的应用程序,以及一个运行可编辑文本字段的应用程序,它看起来会像这样。我们有 3 号应用程序,它可以将可编辑 TF 的输入连接到不可编辑的 TF。

Boost.Interprocess是否有可能以及如何做这样的事情?

我对 C++ 很陌生,但我认为我发现了一些相关的不良信息

禁止引用

引用遭受与指针相同的问题(主要是因为它们被实现为指针)。但是,目前在 C++ 中无法创建完全可用的智能引用(例如,运算符 .() 不能重载)。因此,如果用户想要将对象放入共享内存中,则该对象不能有任何(智能或非智能)引用作为成员。

仅当映射区域在共享内存段的所有进程中映射到相同的基地址时,引用才会起作用。与指针一样,放置在映射区域中的引用应该只指向该映射区域的对象。

虚拟禁止

虚表指针和虚表是在构造对象的进程的地址空间中,所以如果我们放置一个带有虚函数或虚基类的类,放在共享内存中的虚指针对于其他进程就无效了,他们会崩溃。

这个问题很难解决,因为每个进程都需要一个不同的虚拟表指针,并且包含该指针的对象在许多进程之间共享。即使我们在每个进程中将映射区域映射到相同的地址,虚拟表也可以在每个进程中位于不同的地址。要为进程之间共享的对象启用虚函数,需要对编译器进行深度更改,并且虚函数会受到性能影响。这就是为什么 Boost.Interprocess 没有任何计划在进程之间共享的映射区域中支持虚拟功能和虚拟继承。

小心静态类成员

类的静态成员是类的所有实例共享的全局对象。因此,静态成员在进程中被实现为全局变量。

在构造具有静态成员的类时,每个进程都有自己的静态成员副本,因此在一个进程中更新静态成员不会改变另一个进程中静态成员的值。所以要小心这些类。如果静态成员只是在进程启动时初始化的常量变量,那么它们并不危险,但它们根本不会改变(例如,当像枚举一样使用时)并且它们的值对所有人都是相同的。

但我正在使用同一个库创建我所有的应用程序。当我需要最佳性能时,我将使用线程,但碰巧我需要进程间通信。那么我该怎么办 - 如何创建一种机制来模拟急需的功能?

0 投票
6 回答
2339 浏览

c++ - boost::interprocess::shared_ptr 是线程安全的(和进程间安全的)吗?

我想在线程之间共享数据,并在最后一个用户完成后自动删除它。在大多数情况下,这似乎boost::interprocess::shared_ptr在一个boost::fixed_managed_shared_memory段中使用:但并非总是如此。

那么,boost::interprocess::shared_ptr线程(和进程间)是否安全?

如果我在固定地址使用我的共享内存(我很确定这在我的 64 位(嗯,48 位)地址空间中会没问题),是否可以使用普通的boost::shared_ptr(它们是线程安全)而不是?

一些澄清:

我使用的指针类型是 plain void*,(我的共享内存映射到一个固定地址)。

线程安全的问题与引用计数有关——即,是否允许同时在不同进程中复制/销毁指向同一事物的共享指针。在不同的线程中不能访问同一个共享指针,也不能访问被指针。

0 投票
2 回答
1567 浏览

c++ - IPC 安全命名管道

我希望在我的应用程序中使用命名管道。服务器将是 NT 服务,客户端是用户空间应用程序。我认为如果有人可以创建锁定管道(或其他东西)的应用程序客户端并且我的服务器停止接收消息,则可能会出现问题。

我想补充一点,客户端应该始终发送消息,服务器接收它们。如果有人扰乱了这个过程,就会有问题。

我需要建议如何保护命名管道