无法初始化加速共享内存

Boost shared memory can't be initialized

本文关键字:共享 内存 加速 初始化      更新时间:2023-10-16

你好,这就是我的问题:

我正在尝试使用以下代码片段创建一个共享内存段:

      #include <boost/interprocess/managed_shared_memory.hpp>
      using namespace boost::interprocess;
      ...   
      shared_memory_object::remove("MyShareMem");
      try {
        managed_shared_memory segment_(create_only,
                                       "MyShareMem",
                                       10 * 1024 * 1024);
        ...
      }
      catch (interprocess_exception &ex) {
        std::cout << "Exception: "<< ex.what() << std::endl;
      }

但是我有一个例外:

Exception: boost::interprocess::intermodule_singleton initialization failed

我不知道该做什么,也不知道如何解决这个问题。

有什么办法可以解决这个问题吗?


更新:

我在这里找到了解决方案Boost::interprocess_exception - library_error异常创建shared_memory_object

这有点奇怪,但这里的boost依赖于Windows事件记录器。如果没有ID = 6005的事件。它抛出一个异常。

boost 1.62.0 win32_api.hpp中的代码片段

//Obtains the bootup time from the System Event Log,
//event ID == 6005 (event log started).
//Adapted from http://msdn.microsoft.com/en-us/library/windows/desktop/bb427356.aspx
inline bool get_last_bootup_time(std::string &stamp)
{
   const char *source_name = "System";
   const char *provider_name = "EventLog";
   const unsigned short event_id = 6005u;

解决方案是添加事件6005,然后一切都可以正常工作。

我在这里找到了解释,为什么使用windows系统事件日志记录器。从boost docs共享内存模拟文件夹

共享内存(shared_memory_object)在windows中使用内存映射文件,放在共享目录中的共享文档"文件夹(软件 Windows CurrentVersion 微软Explorer 壳文件夹普通AppData)。此目录名是最后一次启动时间通过COM调用(ifBOOST_INTERPROCESS_BOOTSTAMP_IS_LASTBOOTUPTIME)定义或搜索启动事件的系统日志(默认实现),因此每次启动共享内存都创建在一个新的文件夹中获取内核持久化共享内存.

如果使用BOOST_INTERPROCESS_BOOTSTAMP_IS_LASTBOOTUPTIME,由于COM实现相关的错误,在Boost 1.48 &Boost 1.49转储启动时文件夹,并在其中直接创建文件共享文档文件夹,恢复到文件系统持久性共享内存。Boost 1.50修复了这些问题并恢复了启动时间目录和内核持久性。如果您需要重现Boost 1.48,与编译的应用程序通信的Boost 1.49行为那个版本,注释#define BOOST_INTERPROCESS_HAS_KERNEL_BOOTTIME指令的Windows配置部分促进/进程间/细节/workaround.hpp。

如果使用默认实现,(BOOST_INTERPROCESS_BOOTSTAMP_IS_LASTBOOTUPTIME undefined)没有找到启动事件,这可能是由于某些错误的软件溢出或擦除事件日志。

在任何错误情况下(共享文档文件夹未定义或未启动)无法获得时间,库抛出错误。你仍然可以使用增加。将自己的目录定义为共享的进程间目录目录中。在使用时只定义BOOST_INTERPROCESS_SHARED_DIR_PATH库和该路径将用于放置共享内存文件

在那里你也可以找到一个更好的解决问题的方法。您只需要通过定义BOOST_INTERPROCESS_SHARED_DIR_PATH来设置存储boost共享内存文件的文件夹。并且您将不会依赖于windows事件记录器。

评论太晚了,但无论如何

BOOST_INTERPROCESS_SHARED_DIR_PATH将硬编码不在最佳实践列表中的路径。更好的方法是定义BOOST_INTERPROCESS_SHARED_DIR_FUNC并实现

void get_shared_dir(std::string& shared_dir)
{
    // get dir path from environment variable for instance
}