boost interprocess managed_mapped_file发现失败

时间:2015-02-09 15:25:49

标签: c++ boost boost-interprocess

我正在尝试使用Boost中的进程间共享跨进程的结构。

我已经将映射文件定义为使用null互斥锁,因为我遇到了锁定问题而且我不介意自己进行同步。

我遇到的问题是发现物体。

我有以下声明:

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);

由于某种原因,find方法在进程B中返回null。我意识到我必须做一些愚蠢的事情,但无法弄明白。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

您不必绕过默认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在你的平台和平台上使用默认配置工作。安装。