Boost共享内存无法初始化

时间:2016-09-28 08:59:47

标签: c++ boost shared-memory

嗨,我的问题是:

我正在尝试使用此代码段创建共享内存段:

      #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 exception when creating shared_memory_object

这有点奇怪,但这里的升级依赖于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,所有工作再次正常。

2 个答案:

答案 0 :(得分:1)

我在这里找到了解释,为什么使用windows系统事件记录器。来自提升文档Shared memory emulation folder

  

共享内存(shared_memory_object)在windows中实现   内存映射文件,放在共享的共享目录中   文件夹   (SOFTWARE \微软\的Windows \ CurrentVersion \ Explorer的\壳牌   文件夹\ Common AppData)。此目录名称是上次启动时间   通过COM调用获得(如果   BOOST_INTERPROCESS_BOOTSTAMP_IS_LASTBOOTUPTIME)已定义或搜索   系统日志为启动事件(默认实现),所以   每个启动共享内存都是在新文件夹获取中创建的   内核持久性共享内存

     

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

     

如果使用默认实现,   (BOOST_INTERPROCESS_BOOTSTAMP_IS_LASTBOOTUPTIME undefined)和   找不到启动事件,这可能是由于某些有缺陷的软件造成的   洪水或擦除事件日志。

     

在任何错误情况下(未定义共享文档文件夹或启动   无法获得时间,库会抛出错误。你还可以   使用Boost.Interprocess将您自己的目录定义为共享   目录。 使用时只需定义BOOST_INTERPROCESS_SHARED_DIR_PATH即可   库和该路径将用于放置共享内存文件

此外,您还可以找到更好的解决方案。您只需要通过定义 BOOST_INTERPROCESS_SHARED_DIR_PATH 来设置自己的文件夹存储boost共享内存文件的位置。而且你不会依赖于Windows事件记录器。

答案 1 :(得分:1)

评论太晚了

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
}