无法初始化加速共享内存
Boost shared memory can't be initialized
你好,这就是我的问题:
我正在尝试使用以下代码片段创建一个共享内存段:
#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
}
- 使用Boost Interprocess创建托管共享内存需要很长时间
- 字符串共享内存映射的向量
- CUDA 使用共享内存平铺 3D 卷积实现
- 共享内存:MapViewOfFile 返回错误 5
- 如何在多写入器情况下对文件支持的共享内存中的大页面出错
- 有没有办法列出所有共享内存对象的名称?
- 共享内存的升压容器是否实现锁定?
- 共享内存中的健壮互斥锁不是那么健壮
- 使用IPC/共享内存将Integer数组从C++传递到Python
- 共享内存和性能
- 在这种特殊情况下,我是否需要在共享内存中使用原子类型
- 是否可以在专用内存空间中分配一个为提升管理共享内存而创建的对象
- fork(),在C中共享内存和指针
- 访问共享内存而不使用易失性、std::atomic、信号量、互斥锁和自旋锁
- 提升进程间共享内存open_or_create每次都会引发异常
- 通过 mmap-ed 共享内存传递可变长度 C 字符串
- 越界访问 CUDA 共享内存
- 在共享内存中插入映射映射时出现编译器错误
- 矩阵矢量产品 CUDA 通过平铺和共享内存提高性能
- 如何更改在 c++ 中使用提升库创建的共享内存的路径