提升进程间 managed_mapped_file 发现失败
boost interprocess managed_mapped_file find failing
我正在尝试使用 Boost 中的进程间跨进程共享结构。
我已将映射文件定义为使用空互斥锁,因为我在锁定时遇到了问题,而且我不介意自己进行同步。
我遇到的问题是寻找对象。
我有以下声明:
typedef boost::interprocess::basic_managed_mapped_file
< char,
boost::interprocess::rbtree_best_fit<boost::interprocess::null_mutex_family,boost::interprocess::offset_ptr<void>>,
boost::interprocess::flat_map_index>
my_mapped_file;
在进程A中,我做:
m_managedMappedFile.reset(new my_mapped_file(bip::open_or_create, filename, filesize));
auto hdr = m_managedMappedFile->find_or_construct<Foo>(bip::unique_instance)();
auto x = m_managedMappedFile->find<Foo>(bip::unique_instance);
如我所料,它找到了对象。现在,在进程 B 中:
m_managedMappedFile.reset(new my_mapped_file(bip::open_only, filename));
auto ret = m_managedMappedFile->find<Foo>(bip::unique_instance);
出于某种原因,进程 B 中的查找方法 returns 为 null。我意识到我一定是在做一些愚蠢的事情,但无法弄清楚。
有人能帮忙吗?
您不必绕过默认 bip::managed_mapped_file
索引的锁定机制。
看看你是否可以运行以下成功:
#include <iostream>
#include <boost/interprocess/managed_mapped_file.hpp>
namespace bip = boost::interprocess;
struct X {
int i;
};
int main()
{
{
bip::managed_mapped_file f(bip::open_or_create, "/tmp/mmf.bin", 1ul << 20);
if (!f.find<X>(bip::unique_instance).first) {
auto xp = f.find_or_construct<X>(bip::unique_instance)();
assert(xp);
xp->i = 42;
}
}
{
bip::managed_mapped_file f(bip::open_only, "/tmp/mmf.bin");
auto xp = f.find<X>(bip::unique_instance).first;
if (xp)
std::cout << "value: " << xp->i++ << "\n";
}
}
这应该在第一个 运行 上打印 42
(或在重新创建文件之后),并在每个后续 运行.
上增加数字
我将查看 unique_instance_t*
段管理器重载背后的实现,但我怀疑它们可能无法工作因为互斥策略已取消.不过目前这只是一种预感。
我会专注于找出为什么您无法在您的平台和安装的默认配置下让 Interprocess managed_mapped_file
工作。
我正在尝试使用 Boost 中的进程间跨进程共享结构。
我已将映射文件定义为使用空互斥锁,因为我在锁定时遇到了问题,而且我不介意自己进行同步。
我遇到的问题是寻找对象。
我有以下声明:
typedef boost::interprocess::basic_managed_mapped_file
< char,
boost::interprocess::rbtree_best_fit<boost::interprocess::null_mutex_family,boost::interprocess::offset_ptr<void>>,
boost::interprocess::flat_map_index>
my_mapped_file;
在进程A中,我做:
m_managedMappedFile.reset(new my_mapped_file(bip::open_or_create, filename, filesize));
auto hdr = m_managedMappedFile->find_or_construct<Foo>(bip::unique_instance)();
auto x = m_managedMappedFile->find<Foo>(bip::unique_instance);
如我所料,它找到了对象。现在,在进程 B 中:
m_managedMappedFile.reset(new my_mapped_file(bip::open_only, filename));
auto ret = m_managedMappedFile->find<Foo>(bip::unique_instance);
出于某种原因,进程 B 中的查找方法 returns 为 null。我意识到我一定是在做一些愚蠢的事情,但无法弄清楚。
有人能帮忙吗?
您不必绕过默认 bip::managed_mapped_file
索引的锁定机制。
看看你是否可以运行以下成功:
#include <iostream>
#include <boost/interprocess/managed_mapped_file.hpp>
namespace bip = boost::interprocess;
struct X {
int i;
};
int main()
{
{
bip::managed_mapped_file f(bip::open_or_create, "/tmp/mmf.bin", 1ul << 20);
if (!f.find<X>(bip::unique_instance).first) {
auto xp = f.find_or_construct<X>(bip::unique_instance)();
assert(xp);
xp->i = 42;
}
}
{
bip::managed_mapped_file f(bip::open_only, "/tmp/mmf.bin");
auto xp = f.find<X>(bip::unique_instance).first;
if (xp)
std::cout << "value: " << xp->i++ << "\n";
}
}
这应该在第一个 运行 上打印 42
(或在重新创建文件之后),并在每个后续 运行.
我将查看 unique_instance_t*
段管理器重载背后的实现,但我怀疑它们可能无法工作因为互斥策略已取消.不过目前这只是一种预感。
我会专注于找出为什么您无法在您的平台和安装的默认配置下让 Interprocess managed_mapped_file
工作。