我正在使用libcds,他们有Michael Hash Map和Split order list的实现.
基于我从文档中收集的信息,我是如何实现它们的:
包括:
#include <cds/map/michael_hash_map.h>
#include <cds/map/split_ordered_list.h>
using namespace cds;
Run Code Online (Sandbox Code Playgroud)
码:
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;
};
Run Code Online (Sandbox Code Playgroud)
码:
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);
} …Run Code Online (Sandbox Code Playgroud) 我正在使用带有默认优化设置(/ O2)的VS2012,此问题仅存在于发布模式中.
我有一些代码使用michael_deque(使用标准GC)和指向(抽象)类型的指针T.
当我尝试将指针推回到派生自的类型时,T应用程序在退出push_back()函数时崩溃michael_deque.
问题似乎完全取决于这种特定类型T,因为编写一个虚拟类foo,在类中派生它bar(并在构造函数中打印一些东西以避免它被优化掉),然后再推回到new bar()michael_deque不会导致崩溃.
T有问题的课程是这样的:
class Task
{
public:
Task() : started(false), unfinishedTasks(1), taskID(++taskIDCounter) {};
Task(unsigned int parentID_) : started(false), unfinishedTasks(1), taskID(++taskIDCounter), parentID(parentID_)/*, taken(0)*/ {};
virtual ~Task() = 0 {};
virtual void execute() final
{
this->doActualWork();
unfinishedTasks--;
}
virtual void doActualWork() = 0;
public:
unsigned int taskID; //ID of this task
unsigned int parentID; //ID of the parent of …Run Code Online (Sandbox Code Playgroud)