【发布时间】:2017-08-16 20:52:24
【问题描述】:
我试图使用 Boost 在磁盘上创建一个内存映射循环缓冲区,我读到了这个答案:https://stackoverflow.com/a/29265629/8474732
但是,我很难读取写入的循环缓冲区。我尝试对“实例”变量执行 push_back,现在实例的大小为 1。太好了。但是我将如何读回内容呢?或者稍后 push_back 附加元素?从相同的分配器和 mmf 创建另一个实例表明该实例的大小为 0。我想要一个可以打开磁盘上的文件并 push_back 循环缓冲区中的值然后返回的函数。我想多次调用这个函数。我正在尝试做的一个例子(来自链接的答案):
#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;
}
}
感谢您的帮助!
【问题讨论】:
-
我已经编辑了问题以包含所需的行为,以及一个 sn-p 函数来重现我得到的行为。还说明了预期的行为。
标签: c++ boost memory-mapped-files boost-interprocess boost-circularbuffer