嗨,我的问题是:
我正在尝试使用此代码段创建共享内存段:
#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,所有工作再次正常。
答案 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
}