LibCds: Michael Hashmap and Split Order List(LibCds:Michael Hashmap 和拆分顺序列表)
问题描述
I am using libcds and they have an implementation of Michael Hash Map and Split order list.
Based on the information I gathered from the doc here is how I implemented them:
includes:
#include <cds/map/michael_hash_map.h>
#include <cds/map/split_ordered_list.h>
using namespace cds;
Code:
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;
};
Code:
class Michael: public TestDs{
private:
cds::map::MichaelHashMap<int,int,cds::map::pair_traits <int, int>, 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() {}
};
And:
class CDSSplit: public TestDs{
private:
cds::map::SplitOrderedList<int,int,cds::map::pair_traits<int,int> ,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() {}
};
I initiate the structures by calling:
TestDs* _gTestDs1 = new Michael(_gConfiguration);
TestDs* _gTestDs2 = new CDSSplit(_gConfiguration);
However I get segmentation faults, when CDSSplit is initiated, or when Michael has its first insert performed.
The Library installed fine with no warnings, and I use other hashtables I don't get any errors.
Thanks for any help
(Also posted, with less detail on the discussion page for the library, but there doesn't appear to be much presence there, will post back if anything is posted there)
Compile Flags: -std=c++0x -O3 -msse2 -m32 -DNDEBUG -DINTEL -g -D_REENTRANT -lrt -pthread -fno-strict-aliasing -l cds -l tbb -lllalloc
GDB Output:
Program received signal SIGSEGV, Segmentation fault.
cds::ordered_list::details::michael_list::implementation<cds::gc::hzp_gc, cds::ordered_list::details::michael_list::adapter<cds::gc::hzp_gc, int, int, cds::map::pair_traits<int, int>, cds::ordered_list::type_traits, std::allocator<int> >, std::allocator<int> >::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::gc::hzp_gc, cds::ordered_list::details::michael_list::adapter<cds::gc::hzp_gc, int, int, cds::map::pair_traits<int, int>, cds::ordered_list::type_traits, std::allocator<int> >, std::allocator<int> >::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
According to the docs, it looks like you are missing the initialization of CDS and the threading manager:
#include <cds/threading/model.h> // threading manager
#include <cds/gc/hzp/hzp.h> // Hazard Pointer GC
// ...
int main()
{
// Initialize CDS library
cds::Initialize() ;
// Initialize Garbage collector(s) that you use
cds::gc::hzp::GarbageCollector::Construct() ;
// attach this thread to CDS:
cds::threading::Manager::attachThread() ;
// Do some useful work
Configuration _gConfiguration;
TestDs* _gTestDs1 = new Michael(_gConfiguration);
TestDs* _gTestDs2 = new CDSSplit(_gConfiguration);
// Terminate GCs
cds::gc::hzp::GarbageCollector::Destruct() ;
// Terminate CDS library
cds::Terminate() ;
return 0;
}
这篇关于LibCds:Michael Hashmap 和拆分顺序列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:LibCds:Michael Hashmap 和拆分顺序列表


- Stroustrup 的 Simple_window.h 2022-01-01
- 从python回调到c++的选项 2022-11-16
- 一起使用 MPI 和 OpenCV 时出现分段错误 2022-01-01
- 使用/clr 时出现 LNK2022 错误 2022-01-01
- 与 int by int 相比,为什么执行 float by float 矩阵乘法更快? 2021-01-01
- STL 中有 dereference_iterator 吗? 2022-01-01
- 静态初始化顺序失败 2022-01-01
- 近似搜索的工作原理 2021-01-01
- C++ 协变模板 2021-01-01
- 如何对自定义类的向量使用std::find()? 2022-11-07