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

c++ - 在 VS 2010 上使用 boost::interprocess 构建代码问题

我正在尝试在 VS 2010 中构建一段代码,该代码通常在网上找到,作为在共享内存中拥有地图的示例。

我得到了这个让我大吃一惊的错误。有任何想法吗?

0 投票
1 回答
10032 浏览

c++ - 使用 Boost 的进程间读写器锁

在解释如何使用 Boost 实现读取器/写入器锁时,这个线程是黄金。它看起来相对简单,我真的很喜欢它,但它似乎也使用了一个未命名的锁,我需要一个进程间解决方案(不需要是可移植的,可以是 Windows-only)。

有没有办法有一个进程间shared_mutex?我看到有一个named_mutex,但我无法让它与shared_lock其他锁一起使用。

任何指针表示赞赏。

[编辑]

与此同时,我遇到了这个几乎击中钉子的线程。我有两个问题:

  1. 它没有显示完整的代码(我猜我需要使用named_upgradable_mutex,但我不太确定)和
  2. 我不喜欢修改后的“writer”的答案,它不使用在析构函数中解锁的现成类,而是对互斥锁进行 3 次原始调用的序列。

仍然欢迎评论或好的解决方案。

0 投票
3 回答
1222 浏览

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

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

  • 我的第一次尝试是在 Win32 中使用命名共享内存,但这里的问题是我不能使用 STL 容器。
  • 在寻找解决方案时,我找到了Boost Interprocess,如果我理解的话,我必须将我的类中的所有 STL 容器更改为“STL”Boost Interprocess 容器。

那么,有没有其他方法可以使用 STL(在 Windows 中)共享类或结构?目标是不要在我们的库中对 Boost 产生过多的依赖。

谢谢

0 投票
1 回答
769 浏览

c++ - 关于 Boost 共享内存的问题

我正在尝试提出一种简单但可移植的方式来使用共享内存。Boost::interprocess似乎是一个不错的起点,但我遇到了一些问题/担忧。

  1. 我可以以某种方式查询 shm 段的存在吗,最好使用 boost API?我总是可以尝试使用create_only并捕获异常来创建它,但这是一个糟糕的设计,我不希望堆栈在“好”路径中展开。
  2. 即使附加了其他进程,我也可以截断该段吗?(当然,前提是我会处理同步)我想所有其他进程都必须重新映射,它们是否也必须重新连接?
  3. Boost doc说,在Windows上,便携式shared_memory_object实际上并不是共享内存本身,而是一个内存映射文件。我理解正确吗?这意味着我必须在 Windows 上使用专门的代码,这是我试图避免的。让我质疑 Boost 是否适合我的目的,还有其他选择吗?与其与 boost 作斗争,我还不如自己编写特定于平台的代码——在您看来,这值得付出努力吗?
0 投票
0 回答
227 浏览

c++ - 在持有 boost::interprocess 共享内存锁时处理核心转储

我正在开发几个多线程进程试图获取通过 boost::interprocess (named_mutex 上的 scoped_lock) 管理的共享内存文件的锁的应用程序。

看起来,如果其中一个进程在持有共享内存文件的锁的同时转储了一个核心,那么所有其他进程最终都会等待这个锁被释放。

关于如何克服这个问题的任何想法?我想确保当持有锁的进程死亡时,它应该确保锁被释放。

我看到的一个问题是我没有调用 named_mutex 对象的析构函数。这可能是这个问题的原因吗?进程核心转储时是否保证调用析构函数?

谢谢!

0 投票
1 回答
438 浏览

c++ - 尝试使用 boost::interprocess::managed_shared_memory::construct 编译应用程序时出错

尝试使用类construct<T>()的方法时收到一个奇怪的编译错误boost::interprocess::managed_shared_memory。我在 1.48 版本中使用 Boost 库,在 4.6.3 版本中使用 GCC。

问题是当我创建一个managed_shared_memory object(它不是结构的成员)然后我尝试使用它的construct<T>()方法构造任何对象时,编译成功:

虽然,当managed_shared_memory对象在结构中定义然后创建时,construct<T>()方法用法的编译失败:

出现以下 GCC 错误,指向construct使用方法的行:

不幸的是,我没有针对其他版本的 Boost 和 GCC 测试它,所以我不知道它是 Boost/GCC 的错误还是功能。

有没有人遇到过类似的错误或知道可能是什么原因?

0 投票
5 回答
4809 浏览

c++ - 是否可以将多态类存储在共享内存中?

假设我有课BaseDerived : public Base. 我使用 boost::interprocess 库构建了一个共享内存段。是否有可能有类似这样的代码:

我在这里看到的问题是,例如 Base 派生类所需的空间是未知的(那么要分配多少 shmem?)

:如何在应用程序之间通过指针传递对象?

0 投票
3 回答
10378 浏览

c++ - 创建字符串的共享内存向量

我正在尝试创建一个管理(std)字符串的共享内存向量的类。

客户端成功将一个字符串添加到向量中(它也成功地从缓冲区中读取该字符串进行调试),管理器(上面的代码)接收到信号(条件变量),写入向量中有一个字符串(第 27 行),但是当它试图通过at()应用程序获取该字符串时会崩溃。


编辑:我已经想通了,使用std::string是不可能的,stringboost ipc 中有一个容器专门用于这种情况。这并没有改变我需要一个 (boost/std) 字符串向量的事实......


如何跨共享内存传递字符串?我需要将它们存储在 shmem 中的某个缓冲区(一次能够存储 >1 个)中,然后在第二个进程中获取 - 这就是要求。输入总是std::string如此,输出也是,但 shmem 中的内部表示可能不同。

0 投票
1 回答
308 浏览

c++ - boost::interprocess::managed_shared_memory 在不同版本的 boost 之间的兼容性

是否有任何明确的兼容性保证 boost::interprocess::managed_shared_memory 可以跨不同的 boost 版本工作?我打算用它在多个进程之间共享一个整数或十个整数(这实际上将充当它们都读取和写入的一段数据的修订号)。这些流程是单独发布的,并且偶尔会终止。

问题是:我是否因为 1.51 中的 managed_shared_memory 无法与 1.44 中的 managed_shared_memory 对话而将自己锁定在一个给定版本的 boost 中?

0 投票
3 回答
3537 浏览

c++ - 使用 boost::interprocess::file_lock 创建一个锁定文件

我想boost::interprocess::file_lock用来确保按进程写入目录的文件x在完成之前P1不会被进程读取P2。为此,我想在写入文件时P1锁定文件boost::interprocess::file_lock,然后在完成后解锁它们。然后P2可以跳过(并返回)任何被锁定的文件。

我遇到的问题是它似乎boost::interprocess::file_lock只允许您锁定存在的文件。但是,如果我先创建文件,然后将其锁定,则会出现竞争条件:

  1. P1创建文件
  2. P2注意到文件并开始读取它
  3. P1锁定文件
  4. P1写入一些数据
  5. P2读取一些数据,到达最后,最后只得到P1' 的一部分输出。

所以我想做的是创建一个文件并在创建后立即将其锁定。有没有办法做到这一点boost::interprocess::file_lock