在磁盘上使用循环缓冲区

时间:2017-08-16 20:52:25

标签: c++ boost memory-mapped-files boost-interprocess boost-circularbuffer

我试图使用Boost在磁盘上创建一个内存映射循环缓冲区,我读到了这个答案:https://stackoverflow.com/a/29265629/8474732

但是,我很难读取写入的循环缓冲区。我尝试在“instance”变量上执行push_back,现在实例的大小为1.很棒。但我怎么读回内容呢?或者稍后推送其他元素?从同一个分配器和mmf创建另一个实例表明该实例的大小为0.我想要一个可以在磁盘上打开文件的函数,并在循环缓冲区中推送一个值,然后返回。我想多次调用这个函数。我正在尝试做的一个例子(从链接的答案中得出):

#include <boost/circular_buffer.hpp>
#include <boost/interprocess/allocators/allocator.hpp>
#include <boost/interprocess/managed_mapped_file.hpp>

namespace bip = boost::interprocess;

struct message {
    int data[32];
};

void writeFunction() {
    bip::managed_mapped_file mmf(bip::open_or_create, "./circ_buffer.bin", 4ul << 10);
    typedef bip::allocator<message, bip::managed_mapped_file::segment_manager> allocator;

    boost::circular_buffer<message, allocator> instance(10, mmf.get_segment_manager());

    struct message test;
    instance.push_back( test );
}

当我想写入磁盘上的循环缓冲区时,我想调用此函数,并且能够使用其他函数读取它(如下所示):

void readFunction() {
    bip::managed_mapped_file mmf(bip::open_or_create, "./circ_buffer.bin", 4ul << 10);
    typedef bip::allocator<message, bip::managed_mapped_file::segment_manager> allocator;

    boost::circular_buffer<message, allocator> instance(10, mmf.get_segment_manager());

    for(struct message msg : instance) {
        cout << msg.string;
    }
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

链接的帖子是一个极小的例子,它只显示circular_buffer支持Boost进程内存段所需的有状态分配器。

要从段中检索循环缓冲区本身,您需要在共享内存段中构造对象本身(除了传递shared-mem-allocator)。

样本

没有注意效率,这只是一个愚蠢的演示:

<强> Live On Coliru

#include <boost/circular_buffer.hpp>
#include <boost/interprocess/allocators/allocator.hpp>
#include <boost/interprocess/managed_mapped_file.hpp>
#include <iostream>

namespace bip = boost::interprocess;

struct message {
    int data[32];
};

void writeFunction() {
    bip::managed_mapped_file mmf(bip::open_or_create, "./circ_buffer.bin", 4ul << 10);
    typedef bip::allocator<message, bip::managed_mapped_file::segment_manager> allocator;
    typedef boost::circular_buffer<message, allocator> circ_buf;

    auto& instance = *mmf.find_or_construct<circ_buf>("named_buffer")(10, mmf.get_segment_manager());

    struct message test;
    instance.push_back( test );
    std::cout << "pushed a message (" << instance.size() << ")\n";
}

void readFunction() {
    bip::managed_mapped_file mmf(bip::open_or_create, "./circ_buffer.bin", 4ul << 10);
    typedef bip::allocator<message, bip::managed_mapped_file::segment_manager> allocator;
    typedef boost::circular_buffer<message, allocator> circ_buf;

    auto& instance = *mmf.find_or_construct<circ_buf>("named_buffer")(10, mmf.get_segment_manager());

    struct message test;
    while (!instance.empty()) {
        test = instance.front();
        instance.pop_front();
        std::cout << "popped a message (" << instance.size() << ")\n";
    }
}

int main() {
    writeFunction();
    writeFunction();
    writeFunction();

    readFunction();
}

打印

{"a":["1","2","3","4","5","6"]}
4
4
No such node (b)
element_at_checked