在写入之前检查boost :: interprocess :: vector是否有足够的容量?

时间:2018-05-16 11:16:01

标签: c++ c++11 boost shared-memory boost-interprocess

我正在使用共享向量在内存中共享对象:

using ShmemAllocator = bip::allocator<T, bip::managed_shared_memory::segment_manager>;
using MyVector = bip::vector<T, ShmemAllocator>;

bip::permissions perm;
perm.set_unrestricted();
segment.reset(new bip::managed_shared_memory(bip::open_or_create, shared_memory_name, numBytes, 0, perm));

const ShmemAllocator alloc_inst(segment->get_segment_manager());
vec = segment->find_or_construct<MyVector>(shared_vector_name)(alloc_inst);

请注意,向量是在managed_shared_memory对象中创建的,这是通过指定字节数而不是向量元素数来创建的。

然后我将元素写入向量:

int write(const std::vector<T>& vec)
{
    bip::scoped_lock<bip::named_mutex> lock(*sdc.mutex);

    for(const auto& item : vec)
    {
        sdc.vec->push_back(item);
    }

    sdc.cond_empty->notify_all();
}

在写作之前检查我是否有足够的空间来编写所有元素的最安全的方法是什么?我真的想避免简单地分配大量字节并希望我从不打它!

1 个答案:

答案 0 :(得分:0)

  

请注意,向量是在managed_shared_memory对象中创建的,这是通过指定字节数而不是向量元素数来创建的

没有直接的公式,因为细分管理器的开销可能很大并且取决于分配模式:this older answer I demonstrate this quite visually

enter image description here

考虑到这一点,您可以在预期的平台上进行一些测试并锻炼所需的实际尺寸。

但是,您也可以忘掉它,并记住它的所有虚拟内存。只需保留一个TB或三个TB,除非你那些页面,否则不应映射/提交任何内容。

  

如果您想使用managed_mapped_file,您可以愉快地使用ftruncate创建一个非常大的稀疏文件(即没有分配实际的块)并在其中使用它同样的方式。

     

并非所有文件系统都支持稀疏文件,但所有主流文件系统都支持(NTFS,ext2 / 3/4等)。通常,如果不支持稀疏文件,也不支持mmap(想想网络文件系统或高级保险丝驱动程序)