我们正在使用 boost::dynamic_bitset。我们正在寻找从使用 mmap 创建的内存块(无需复制)构造 std::vectorboost::dynamic_bitset
动态位集,顾名思义,明确是关于管理自己的分配的位集。
但是,由于它是分配器感知的,您可以让它从共享内存中分配。例如。使用 boost 进程间:
#include <boost/dynamic_bitset.hpp>
#include <boost/interprocess/allocators/allocator.hpp>
#include <boost/interprocess/managed_shared_memory.hpp>
namespace bip = boost::interprocess;
namespace Shared {
using Segment = bip::managed_shared_memory;
// using Segment = bip::managed_mapped_file; // for COLIRU
using Mgr = Segment::segment_manager;
template <typename T> using Alloc = bip::allocator<T, Mgr>;
using BS = boost::dynamic_bitset<uint32_t, Alloc<uint32_t>>;
} // namespace Shared
#include <iostream>
#include <random>
static std::mt19937 prng{std::random_device{}()};
int main() {
using namespace Shared;
Segment shm(bip::open_or_create, "shared-demo", 10 << 10ull);
BS& bits = *shm.find_or_construct<BS>("bitset")(888, 0, shm.get_segment_manager());
std::cout << "Bitset " << bits.count() << " / " << bits.size() << " set\n";
auto dist = bind(std::uniform_int_distribution<int>(0, bits.size() - 1), ref(prng));
for (auto i = 0; i < 10; ++i) { bits.set(dist()); }
for (auto i = 0; i < 10; ++i) { bits.reset(dist()); }
}
重复运行表明它是如何持久的:
我将把进程间同步(如果需要)作为读者的练习。另外,如果您必须从非托管段进行映射,您可以使用
managed_external_buffer
。我在这个网站上有这两种技术的示例。