Я пытаюсь выделить Folly Concurrent Hash Map на общей памяти с использованием Boost распределителя общей памяти.
#include <boost/interprocess/allocators/allocator.hpp>
#include <boost/interprocess/managed_shared_memory.hpp>
#include <folly/concurrency/ConcurrentHashMap.h>
template<class T>
using ShmAlloc = boost::interprocess::allocator<T,
boost::interprocess::managed_shared_memory::segment_manager>;
using Key = int;
using Value = int;
using Table = folly::ConcurrentHashMap<Key, Value, std::hash<Key>,
std::equal_to<Key>, ShmAlloc<uint8_t >>;
int main()
{
//Create a new segment with given name and size
managed_shared_memory segment(create_only, "SharedTable", 65536);
//Initialize shared memory STL-compatible allocator
ShmAlloc<uint8_t> alloc_inst (segment.get_segment_manager());
Table* table = segment.construct<Table>("t1")(alloc_inst);
// In another process I want to find it
auto res = segment.find<Table>("t1");
Table* found_table = res.first;}
но я получил следующую ошибку:
ConcurrentHashMap.h:496:74: error: no matching function for call to ‘boost::interprocess::allocator<unsigned char, boost::interprocess::segment_manager<char, boost::interprocess::rbtree_best_fit<boost::interprocess::mutex_family>, boost::interprocess::iset_index> >::allocator()’
SegmentT* newseg = (SegmentT*)Allocator().allocate(sizeof(SegmentT));
Я попытался обернуть распределитель общей памяти Boost распределителем, который имеет конструктор по умолчанию и статический член, который хранит экземпляр общей памяти Boost. Это устраняет ошибку компиляции, но возникает серьезная следующая проблема: Ошибка сегментации возникает из-за того, что Параллельная карта хэша не использует Allocator :: pointer (offset_ptr при использовании Boost allocator).
Может кто-нибудь мне помочь?
Задача ещё не решена.
Других решений пока нет …