【发布时间】:2019-06-26 13:21:48
【问题描述】:
我想为多映射创建一个自定义分配器,它将在共享内存中分配元素。我遇到了 boost.interprocess,但发现它实现起来非常复杂。还有其他解决方法吗?
【问题讨论】:
标签: c++ stl shared-memory multimap allocator
我想为多映射创建一个自定义分配器,它将在共享内存中分配元素。我遇到了 boost.interprocess,但发现它实现起来非常复杂。还有其他解决方法吗?
【问题讨论】:
标签: c++ stl shared-memory multimap allocator
我不会在这里给出任何实现,而是给你一些方向。 如果您的共享内存抽象或区域,例如从地址 void* shMemAddr 开始,并且如果您决定您的 stl 容器使用共享内存, 需要做的是让容器从 shMemAddr 开始分配内存,直到有可用内存在您的共享池中分配。您可以使用任何分配策略来实现它,例如使用 malloc 或placement new。此外,要让您的容器使用分配器,您需要提供分配器作为模板参数,对于 multimap,它将是 multimap::allocator_type class Alloc = allocator > 作为第四个模板参数,在 less 作为比较函数之后,例如,如果您在多映射对中存储 int、double 作为键、值对,它可能是这样的
multimap<int,double,less<int>,CustomAlloc<pair<int,double>>>
现在,您的 CustomAlloc 分配器需要满足封装特定低级内存管理的分配器的概念,特别是,如果共享内存是要分配的资源,您需要在多线程环境中安排适当的内存分配。这意味着,首先,您需要一些结构来证明已用内存。例如,它可以是一些链式数据结构,并且这样的实现非常普遍,因此您需要保持该结构的不变量一致。这意味着如果您的已用(或空闲)内存的簿记结构需要在成功分配或解除分配后更新,则需要自动完成,因此可能尝试分配内存的线程仅在 CustomAllocator 分配作业之前看到处于状态的结构启动或分配作业完成后。例如,您的首选可能是使用互斥锁来保护数据、避免竞争和保持不变量。这只是方向,考虑编写自己的分配器并不是很难,我希望这将作为一个好的起点有所帮助。
【讨论】: