我想为多图创建自定义分配器,以分配共享内存中的元素。我遇到了boost.interprocess,但发现实现起来很复杂,还有其他解决方法吗?
答案 0 :(得分:0)
在这里我不会给出任何实现方式,而是给您一些指导。 如果您的共享内存抽象或区域(例如,从aaddress void * shMemAddr开始),并且您决定您的stl容器使用共享内存, 需要做的是使容器从shMemAddr开始分配内存,直到分配给共享池可用的内存为止。您可以使用任何分配策略来实现,例如使用malloc或place new。此外,要使容器可以使用分配器,您需要提供分配器作为模板参数,对于multimap,它将是multimap :: allocator_type 类Alloc = allocator>作为第四个模板参数,在较少时作为比较函数,例如,如果您在int,double作为键,值对的多映射中存储,则可能是这样的
multimap<int,double,less<int>,CustomAlloc<pair<int,double>>>
现在,您的CustomAlloc分配器需要满足封装特定低级内存管理的分配器的概念,特别是如果共享内存是要分配的资源,则需要在多线程环境中安排适当的内存分配。这意味着,首先,您需要某种结构来证明已使用的内存。例如,它可以是某种链式数据结构,并且这样的实现非常普遍,因此您需要保持该结构的不变性一致。这意味着,如果在完全分配或取消分配后需要更新用于保留(或空闲)内存的簿记结构,则需要自动进行更新,因此可能尝试分配内存的线程只能在CustomAllocator分配作业之前的状态下查看结构开始或分配作业完成后。例如,您要做的第一选择可能是使用互斥锁来保护数据,避免争用并保持不变。这只是方向,考虑编写自己的分配器不是很困难,我希望这将作为一个好的起点。