问题标签 [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 回答
1108 浏览

c++ - boost::interprocess::map insert 给出:对重载函数的模糊调用

我正在尝试将一些值插入到存储在共享内存中的 boost::interprocess::map 中。

问题是当我尝试编译它时它给了我“对重载函数的模棱两可的调用”,我不知道为什么。以下是一些代码片段:

这个插入调用给了我一些错误:

有没有人有任何想法?

0 投票
1 回答
217 浏览

c++ - boost 可以拥有带有整数键的地图吗?

0 投票
2 回答
2227 浏览

c++ - 64位和32位进程互通 boost::message_queue

各位好日子

我目前正在尝试寻找一种在 64 位进程和 32 位进程之间传递数据的方法。由于它是一个实时应用程序,并且两者都在同一台计算机上运行,​​因此我很难使用共享内存 (shm)。

当我在寻找一些使用 shm 的同步机制时,我感觉到了 boost::message_queue。但是它不起作用。

我的代码基本上如下:

发件人部分

接收器部分

如果两个进程是 64 位或 32 位,则此代码可以完美运行。但是如果两个过程不相同,则不起作用。

深入了解 boost (1.50.0) 代码,您将在 message_queue_t::do_receive (boost/interprocess/ipc/message_queue.hpp) 中看到以下行:

scoped_lock lock(p_hdr->m_mutex);

由于某种原因,在使用异构进程时,互斥锁似乎被锁定。我的疯狂猜测是互斥锁被抵消了,因此它的价值被破坏了,但我不太确定。

我是否正在尝试完成一些根本不受支持的事情?

任何帮助或建议将不胜感激。

0 投票
1 回答
888 浏览

c++ - 这些 Boost::Interprocess 组件是否需要同步?

我正在使用 IPC 构建一个多生产者/单消费者应用程序,使用Boost.Interprocess实现。

每个生产者通过在共享内存 () 中分配一个块managed_shared_memory::allocate并将一个对象编组到该块中来发送消息。然后,它通过 a 发送一个小对象,该对象message_queue保存块的位置(偏移量)和大小。

消费者receives从队列中取出这个指示符并解组对象。消费者负责释放内存块。

基于这个实现,我不相信内存中存在的对象或块需要同步,因为一旦消费者知道它们,生产者将不再接触它们。因此,我相信只有内部message_queue结构managed_shared_memory需要同步。

我的问题是:记住每个进程都是单线程的,做allocate/deallocatesend/receive调用需要同步吗?

文档提供的 Boost 示例没有使用消息队列的同步,但我认为这只是为了简化示例源。


我见过这个问题,但它询问的是线程安全,而不是 Boost.Interprocess 的这些特定组件。

0 投票
1 回答
238 浏览

c++ - boost::interprocess::string 缺少一个字符并在销毁时出现段错误

我目前正在编写一个应用程序,它使用boost::interprocess. 但是我有一些问题boost::interprocess::stringstring从 a中创建 aconst char*就像预期的那样,但是当我尝试创建一个空字符串并稍后用适当的内容填充它时(因为我在创建字符串时不知道它)它以某种方式丢失了第一个字符。以下示例代码说明了这种行为:

此应用程序的输出是SharedMem|haredMem,所以str保持SharedMem,正如预期的那样。但是str2只包含haredMem,缺少字符串的第一个字符。

那么为什么str2缺少一个字符,我该如何避免这种行为呢?

我遇到的另一个问题是,在编译代码时尝试销毁stringsusingdestroy_ptr会导致段错误(这就是我在上面的代码中取消注释倒数第二行时发生的情况)-O3(但似乎只有这样)。这种行为的原因是什么,我需要做些什么来避免段错误?

我在-std=c++0x -O3 -g虚拟机(virtualBox)内的 linux mint 上使用 gcc 4.6.1(编译标志:)和 boost 1.47

编辑: 事实证明,在没有优化的情况下编译时分配工作正常,但在使用-O2or编译时表现出所描述的行为-O3

此外,即使进行优化,分配也有效(至少在这个人为的示例代码中),如果我做两次,使相关代码看起来像这样:

虽然到目前为止这似乎避免了这个问题,但它几乎不是我想要依赖的解决方案。

0 投票
2 回答
395 浏览

c++ - 如何获取 boost::interprocess::managed_shared_memory 的名称

我创建了一个managed_shared_memory具有名称和大小的对象。之后,我想再次获得这个名字。我该怎么做呢?我希望会有类似get_name或类似的功能,但我找不到。

0 投票
2 回答
1058 浏览

c++ - 尽管应该返回,但使用计时器块提升进程间作用域锁

我有一些使用boost inteprocess scoped lock with timers. 当在一个线程中获取互斥锁时,第二个线程试图获取它几毫秒将失败,并将记录一些内容到屏幕上。

我不知道为什么,但是对于 boost 1.50 的版本,这不再起作用了。下面的代码我可以看到线程#2 没有打印“ERROR”,而是完全卡住了。

我在这里错过了什么吗?

我正在使用带有 g++ 的 LINUX 内核 2.6.32。

可以处理UTC吗?我读到这种锁使用的时间是UTC,并且在我现在正在阅读的日期时间中,关于local_adjustor从本地到UTC的转换,反之亦然。

AFG

0 投票
2 回答
11082 浏览

boost - 通过 boost 消息队列发送复杂的数据结构

我有以下数据结构:

使用 boost 消息队列,我尝试将此数据结构发送到另一个进程中的消息队列接收器。但是,收到后,在访问上述结构中的“名称”变量时出现分段错误。

以下是我的发件人功能:

以下是我的接收器功能:

(*recvMsg).id 的 cout 没问题,但 (*recvMsg).name 的 cout 出现分段错误。在某处读到我需要对结构进行序列化,但不知道该怎么做。任何人都可以建议吗?

0 投票
1 回答
10830 浏览

c++ - 与 boost::interprocess 共享映射

我有一个可能很难解决的简单要求。我确实找到了一些这样这样的线索,但我似乎无法轻松使用它们。前者甚至没有为我翻译成可构建的代码。我对 Boost 没有经验,只能自己写这个,但在我看来,这可能是一个常见的要求。

我也遇到过Interprocess STL Map,但我还不能将它组装成工作代码。

我在想boost::interprocess是去这里的路,除非我想从头开始创建一些共享内存映射。

我不关心便携性。我需要一个可以与 MS 编译器一起使用的解决方案,特别是 VS 2010 附带的那个。

这张海报似乎或多或少想要做我想做的事情,除了我需要将 GUID 映射到任意长度的二进制缓冲区(但 int 到字符串同样可以作为起点)。不幸的是,我无法干净地编译代码,甚至无法从实验开始。

另外我有两个担忧:A)是否可以自动(或至少可预测地)增长/缩小共享内存以适应分配需求和 B)假设一个进程创建映射,另一个进程如何“附加”到它?

我不介意解决方案是否需要多个共享“段”以满足分配需求。它不一定必须是单个整体共享内存块。

非常感谢任何帮助。

0 投票
1 回答
2703 浏览

c++ - 如何为 Windows 使用 Boost 进程间消息队列?

我正在使用 Boost Interprocess 实现进程间通信。作为测试,我从boost 文档中获取了示例。

第一个进程(创建消息队列)启动另一个进程(应该从队列中接收消息)使用CreateProcess(NULL, (LPSTR)commandStream.str().c_str(), NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi)

第一个进程使用创建队列message_queue mq(create_only, "message_queue", 100, sizeof(int))

不幸的是,message_queue mq(open_only, "message_queue")抛出一个interprocess_exception. 例外包含描述Das System kann die angegebene Datei nicht finden。(系统找不到请求的文件)。

当队列的创建和打开都在一个进程中完成时,不会引发异常并且通信按照文档中的描述进行。

有人知道什么可能导致异常以及我如何解决它?

编辑:我正在使用 Boost 1.45