circular_buffer 和 Managed_mapped_file 分段错误

2023-12-01

我正在使用 boost 1.73.0,并尝试将circular_buffer 与manage_mapped_file 一起使用以将字符串存储在磁盘上持久存在的循环缓冲区中。

我执行以下操作来创建/打开circular_buffer:

boost::interprocess::managed_mapped_file mmf(boost::interprocess::open_or_create, "./circ_buffer.bin", 10u << 10);
typedef boost::interprocess::allocator<std::string, boost::interprocess::managed_mapped_file::segment_manager> string_allocator;
typedef boost::circular_buffer<std::string, string_allocator> circ_buf;
circ_buf* instance = mmf.find_or_construct<circ_buf>("some_name")(10, mmf.get_segment_manager());

这效果很好,我可以将字符串放入circular_buffer中,如下所示:

for(int idx = 0 ; idx < 15; idx++) {
    std::string v = "mystring1-" + std::to_string(idx);
    instance->push_back(v);
}

查看原始文件(即使它是二进制的),我确实看到了其中的字符串,所以看起来circular_buffer确实被保留了。

但是,如果我尝试在另一个进程中加载​​circular_buffer(如第一个代码片段所示)并读取第一个元素,如下所示:

instance->front()

我遇到分段错误。 我知道最终我需要围绕内存访问进行同步,但这不应该是上面示例中的问题,因为在任何给定时间只有一个进程正在访问文件。

有趣的是,如果我在分配器中用 char 替换 std::string 我不会出现分段错误。 我究竟做错了什么?

参考值 克劳斯


boost::interprocess::managed_mapped_file mmf(boost::interprocess::open_or_create, "./circ_buffer.bin", 10u << 10);
typedef boost::interprocess::allocator<std::string, boost::interprocess::managed_mapped_file::segment_manager> string_allocator;
typedef boost::circular_buffer<std::string, string_allocator> circ_buf;
circ_buf* instance = mmf.find_or_construct<circ_buf>("some_name")(10, mmf.get_segment_manager());

您分配string共享内存中的对象。然而,string它本身进行分配,并且您从未告诉它使用共享内存分配器。

您可能会看到的原因short数据中的字符串是因为SSO

固定版本

住在科里鲁

#include <boost/circular_buffer.hpp>
#include <boost/interprocess/managed_mapped_file.hpp>
#include <boost/interprocess/containers/string.hpp>
#include <iostream>
#include <iomanip>
namespace bip = boost::interprocess;

namespace Shared {
    using Mem = bip::managed_mapped_file;
    using Segment = Mem::segment_manager;

    template <typename T> using Alloc = bip::allocator<T, Segment>;
    template <typename T> using Buffer = boost::circular_buffer<T, Alloc<T> >;

    using String = bip::basic_string<char, std::char_traits<char>, Alloc<char> >;
    using StringBuf = Buffer<String>;
}

int main() {
    using namespace Shared;
    Mem mmf(bip::open_or_create, "./circ_buffer.bin", 10U << 10);

    auto& buf = *mmf.find_or_construct<StringBuf>("some_name")(10, mmf.get_segment_manager());

    for (auto& s : buf) {
        std::cout << "Existing " << std::quoted(std::string_view(s)) << "\n";
    }

    for (char const* init : {"foo", "bar", 
            "some pretty long string to make sure we don't fall into SSO territory"
            "some pretty long string to make sure we don't fall into SSO territory"
            "some pretty long string to make sure we don't fall into SSO territory"
            "some pretty long string to make sure we don't fall into SSO territory"
        })
    {
        buf.push_back(String(init, mmf.get_segment_manager()));
    }
}

在第二次运行时打印:

Existing "foo"
Existing "bar"
Existing "some pretty long string to make sure we don't fall into SSO territorysome pretty long string to make sure we don't fall into SSO territorysome pretty long string to make sure we don't fall into SSO territorysome pretty long string to make sure we don't fall into SSO territory"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

circular_buffer 和 Managed_mapped_file 分段错误 的相关文章

随机推荐

  • 如何停用某些 symfony2 调试工具栏元素?

    我正在使用 symfony2 它的调试工具栏很棒 但是 我来安装一些额外的捆绑包 其中添加了一些元素 现在它显示在两个级别上 如何从工具栏中删除某些元素 例如 我不需要有关我的 phpversion 的信息 不需要有关路线的信息等 工具栏的
  • Android:使用audiorecord类录制音频快进播放

    我正在尝试录制音频并存储到 SD 卡中并发送到服务器 当我尝试播放录制的语音时 它会播放 但不是我录制的那样 如果我录制语音 10 分钟 它将播放 4 分钟 即有人按下快进按钮 并发出一些嘈杂的声音 我没有明白我要去哪里错了 谁能告诉我如何
  • Xcode / IOS 多个应用程序具有相同的代码库/项目

    我正在尝试设置 xcode 以允许我使用相同的代码构建 发布 2 个应用程序 但使用不同的应用程序图标 资产和不同的数据库 如果我有 2 个应用程序使用相同的代码 应用程序1 水果列表 显示水果列表 应用程序2 蔬菜列表 显示蔬菜列表 对于
  • 使用 IB 的 UIToolbar 内的 UILabel 在运行时不可见,如何修复?

    我想在工具栏中显示总计 我将 IB 中的 UILabel 放在工具栏顶部 但是 当我运行应用程序时 UILabel 完全不可见 但可以在代码上设置值 最奇怪的是 在其他形式下 一切都工作正常 我不明白为什么在一种形式下有效 但在另一种形式下
  • 来自 PHP 的 MongoDB 集合 runCommand

    我有这个example db Wall runCommand text search See 如何从 PHP 调用它 我找不到该方法MongoCollection class 注意我正在运行 mongo 2 4 dev 版本 我尝试使用名为
  • jqGrid批量保存-编辑模式下如何获取所有行数据

    我有一个 jqGrid 默认情况下在编辑模式下显示 100 多行 我试图找出一种方法 在一次调用中将所有行数据发送到服务器 问题 如何在编辑模式下获取行数据 getRowData 方法返回 html 获得所有行数据后 我希望能够以 JSON
  • Z3 4.3.1 C-API parse_smtlib2_string:从哪里获取声明?

    不幸的是 我没有足够的声誉来评论其他问题的答案 所以我必须开始一个新问题 基本上我有与描述相同的问题here 我想使用 Z3 进行增量求解 为了将约束引入 Z3 我使用 smtlib2 字符串 对于第一组约束 一切正常 我可以将变量等的声明
  • 用于打印文本文件中搜索字符串的上一行和下一行的批处理脚本

    我有一个批处理脚本 它将把搜索字符串的整行打印到文本文件中 for i in log txt do FINDSTR G pattern txt i gt gt output txt 例子 pattern txt 包含搜索字符串ERROR下面
  • 发推文,不使用推文表

    我使用下面的代码来分享内容 来自UITextView UIImageView 通过推特 void shareViaTweet NSString shareMessage if SLComposeViewController isAvaila
  • Java 6 JVM 挂起

    对于这么长的帖子 我深表歉意 但我想知道在向 Sun 提交错误报告之前是否可以吸引更多人的关注 虚拟机 6u11操作系统 Windows XP SP3硬件 AMD Athlon 64 X2 4600 2 41GHz 配备 3 25 GB R
  • CollapsingToolbarLayout 副标题

    我可以设置标题吗CollapsingToolbarLayout通过setTitle方法 还有设置字幕的方法吗 如果你想让字幕转到Toolbar当 的时候AppBar已完全折叠 您应该创建您的自定义CoordinatorLayout Beha
  • 缺少 libmmal.so 和 picamera 库

    使用 pip 安装 picamera 库后 每当我导入该库时 都会收到此错误 OSError libmmal so cannot open shared object file No such file or directory 我正在运行
  • 如何本地化alloyui调度程序组件?

    我正在尝试将 Alloyui 调度程序完全本地化为法语 继这篇文章之后 如何获取 YUI 3 或 AlloyUI 组件的本地化版本 工作快完成了 但是我仍然缺少两件事的提示 我需要将左栏中的时间格式从 1 12am pm 更改为 1 24
  • html,css - 图片下方奇怪的隐形边距

    我在这里疯了 不知何故 在我页面中的所有图像下方有一个间隙 代码中不存在的边距 即使 Firebug 也看不到它 但 Firefox 和 Safari 正在渲染它 即使根本没有 CSS 这以前从未发生在我身上
  • 进行 GameCenter 身份验证的正确方法是什么?

    我在有关堆栈溢出的帖子中看到过 其中显示了处理 GameCenter 身份验证的片段 然而 这些解决方案都不能解决现实世界用例所涉及的任何问题 也就是说 GKLocalPlayer localPlayer authenticateHandl
  • 使用 Ajax 检查 WooCommerce 结帐中的现有电子邮件

    我正在尝试检查 WooCommerce 结账中 billing email 字段的插入值 以了解它是否存在 这是functions php中的代码 add action wp enqueue scripts live validation
  • JOIN 结果长度超过 50,000 个字符的限制

    我正在尝试组合 A 列中的文本并将其与 B 列的每种可能性相匹配 我使用了以下公式 in C1 transpose split join arrayformula rept filter A1 A len A1 A char 9999 co
  • OpenMP set_num_threads() 不起作用

    我正在使用 C 中的 OpenMP 编写并行程序 我想使用控制程序中的线程数omp set num threads 但它不起作用 include
  • Fortran 中的大实数运算

    我编写了一个 Fortran 代码来计算给定列表的第 i 次排列 1 2 3 n 无需计算所有其他的 即n 我需要它来找到 TSP 旅行推销员问题 的第 i 条路径 When n 很大 代码给了我一些错误 我测试发现找到的第 i 个排列不是
  • circular_buffer 和 Managed_mapped_file 分段错误

    我正在使用 boost 1 73 0 并尝试将circular buffer 与manage mapped file 一起使用以将字符串存储在磁盘上持久存在的循环缓冲区中 我执行以下操作来创建 打开circular buffer boost