Я использую libcds , и у них есть реализация Michael Hash Map и Split order list. .
На основе информации, которую я собрал из документа, вот как я их реализовал:
включает:
#include
#include
using namespace cds;
Код:
class TestDs {
public:
virtual bool containsKey(int key)=0;
virtual int get(int key)=0;
virtual int put(int key, int value)=0;
virtual int remove(int key)=0;
virtual int size()=0;
virtual const char* name()=0;
virtual void print()=0;
virtual void shutdown()=0;
};
Код:
class Michael: public TestDs{
private:
cds::map::MichaelHashMap, cds::map::type_traits, CDS_DEFAULT_ALLOCATOR> _ds;
public:
Michael(const Configuration& config) : _ds(config.initial_count,config.load_factor) {
}
bool containsKey(int key) {
return (_ds.find(key)!=0);
}
int get(int key) {
return _ds.find(key);
}
int put(int key, int value) {
return _ds.insert(key,value);
}
int remove(int key) {
return _ds.erase(key);
}
int size() {
return _ds.size();
}
const char* name() {
return "Micheal";
}
void print() {}
void shutdown() {}
};
И:
class CDSSplit: public TestDs{
private:
cds::map::SplitOrderedList ,cds::map::split_list::type_traits,CDS_DEFAULT_ALLOCATOR> _ds;
public:
CDSSplit(const Configuration& config) : _ds(config.initial_count, config.load_factor) {
}
bool containsKey(int key) {
return (_ds.find(key)!=0);
}
int get(int key) {
return _ds.find(key);
}
int put(int key, int value) {
return _ds.insert(key,value);
}
int remove(int key) {
return _ds.erase(key);
}
int size() {
return _ds.size();
}
const char* name() {
return "CDSSPlit";
}
void print() {}
void shutdown() {}
};
Я инициирую структуры, вызывая:
TestDs* _gTestDs1 = new Michael(_gConfiguration);
TestDs* _gTestDs2 = new CDSSplit(_gConfiguration);
Однако я получаю ошибки сегментации, когда запускается CDSSplit или когда Майкл выполняет свою первую вставку.
Библиотека установлена нормально, без предупреждений, и я использую другие хэш-таблицы, я не получаю никаких ошибок.
Спасибо за любую помощь
(Также опубликовано, с меньшими подробностями на странице обсуждения библиотеки, но, похоже, там не так много присутствия, отправлю обратно, если там что-нибудь будет опубликовано)
Флаги компиляции: -std = c ++ 0x -O3 -msse2 -m32 -DNDEBUG -DINTEL -g -D_REENTRANT -lrt -pthread -fno-strict-aliasing -l cds -l tbb -lllalloc
Вывод GDB:
Program received signal SIGSEGV, Segmentation fault.
cds::ordered_list::details::michael_list::implementation, cds::ordered_list::type_traits, std::allocator >, std::allocator >::insert (this=0xafd42028, refHead=..., pNode=0x8440060) at /usr/include/cds/ordered_list/details/michael_list_hpgen.h:457
457 position pos( gc_base_class::getGC() ) ;
(gdb) backtrace
#0 cds::ordered_list::details::michael_list::implementation, cds::ordered_list::type_traits, std::allocator >, std::allocator >::insert (this=0xafd42028, refHead=..., pNode=0x8440060) at /usr/include/cds/ordered_list/details/michael_list_hpgen.h:457
#1 0x0805323e in insert (this=0x8470070, key=2, value=2) at /usr/include/cds/ordered_list/details/michael_list_hpgen.h:430
#2 insert (this=0x8470070, key=2, value=2) at /usr/include/cds/ordered_list/details/michael_list_hpgen.h:195
#3 insert (this=0x8470070, key=2, value=2) at /usr/include/cds/map/michael_hash_map.h:487
#4 Michael::put (this=0x8470070, key=2, value=2) at ../test/main.cpp:450
#5 0x0804b129 in FillTable (table_size=5033165) at ../test/main.cpp:876
#6 0x0804c7b2 in RunBenchmark () at ../test/main.cpp:961
#7 0x0804e617 in main (argc=9, argv=0xbffff714) at ../test/main.cpp:846