【问题标题】:Boost inter process shared memory open_or_create throws exception every timeBoost进程间共享内存open_or_create每次都抛出异常
【发布时间】:2017-08-25 13:21:12
【问题描述】:

我正在编写实时数据以增加共享内存。最初我每次想访问 shm 时都使用它:

boost::interprocess::managed_shared_memory  segment(boost::interprocess::open_or_create, "MySharedMemory",20000000);

在调试模式下我发现这个调用总是抛出这个异常:

First-chance exception at 0x00007FFA30BB95FC in testerud.exe: Microsoft C++ exception: boost::interprocess::interprocess_exception at memory location 0x000000000550E1C0.

但我能够打开并将我的数据推送到共享内存。我找到了解决这个问题的方法。我在进程开始时为open_or create 创建了另一个函数,然后每次都使用open_only 编写。也不例外。

我很好奇这背后的原因。

【问题讨论】:

  • “在调试模式下,我发现这个调用总是抛出这个异常”——如果你说它总是失败,频率有什么关系?
  • 另外,如果没有其他线程/进程,为什么每次都打开段?保持段打开。否则“实时”很快就会成为说“狗慢”的好方法
  • 是的,这里不相关。我会删除它。谢谢。
  • 我正在关闭它,因为我有另一个应用程序可以访问和转储数据。
  • 这就是原因。干得好! (哦,啊哈,我以为您的意思是结束问题,我想您不妨接受现有答案)

标签: c++ boost shared-memory


【解决方案1】:

来自 boost 文档:

托管内存段还提供了对构造的命名和唯一对象进行迭代以进行调试的可能性。 注意:此迭代不是线程安全的,因此用户应确保没有其他线程正在处理段中的命名或唯一索引(创建、擦除、保留...)。其他不涉及索引的操作可以同时执行(例如原始内存分配/释放)。

【讨论】:

  • 好的,谢谢,但没有其他线程或进程访问它。即使是这样,那么 open_only 和 open_or_create 会有什么不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-07
  • 1970-01-01
  • 2020-02-25
  • 2017-05-14
  • 2014-05-08
相关资源
最近更新 更多