Я использую общий вектор для совместного использования объектов в памяти:
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();
}
Какой самый безопасный способ проверить, достаточно ли у меня места для записи всех моих элементов перед записью? Я действительно хотел бы избежать простого назначения большого количества байтов и надеяться, что я его никогда не получу !