C++ TBB:初始化并发\u散列\u映射

C++ TBB:初始化并发\u散列\u映射,c++,tbb,C++,Tbb,我正在尝试初始化2D concurrent_hash_映射,这是“英特尔TBB”库中提供的一个容器。编译通过,并且在运行时没有错误。但是,并非所有初始化值都在容器中可用,从而导致不正确的行为 哈希映射定义为 template<typename K> struct MyHashCompare { static size_t hash(const K& key) { return boost::hash_value(key); } static bool equa

我正在尝试初始化2D concurrent_hash_映射,这是“英特尔TBB”库中提供的一个容器。编译通过,并且在运行时没有错误。但是,并非所有初始化值都在容器中可用,从而导致不正确的行为

哈希映射定义为

template<typename K>
struct MyHashCompare {
    static size_t hash(const K& key) { return boost::hash_value(key); }
    static bool equal(const K& key1, const K& key2) { return (key1 == key2); }
};

typedef concurrent_hash_map<int, int, MyHashCompare<int> > ColMap; 
typedef concurrent_hash_map<int, ColMap, MyHashCompare<int> > RowMap;
模板
结构MyHashCompare{
静态大小\u t散列(常数K和键){返回boost::散列值(键);}
静态布尔相等(常数K&key1,常数K&key2){return(key1==key2);}
};
typedef并发_散列_映射ColMap;
typedef并发_散列_映射行映射;
函数对象的定义如下。不正确行为的原因可能来自这里吗

class ColumnInit {
    RowMap *const pMyEdgeMap;
public:
    void operator()(const blocked_range<size_t>& r) const {
        RowMap* pEdgeMap = pMyEdgeMap;
        RowMap::accessor accessX;
        ColMap::accessor accessY;
        for(size_t n1 = r.begin(); n1 != r.end(); n1++)
        {
            pEdgeMap->insert(accessX, n1);
            for(int n2 = 1; n2 <= 64; n2++)
            {
                int diff = abs((int)n1 - n2);
                if ((diff == 8) || (diff == 1))
                {
                    assert((accessX->second).insert(accessY, n2));
                    accessY->second = -1;
                }
                else
                {
                    assert((accessX->second).insert(accessY, n2));
                    accessY->second = 0;
                }
            }
        }
    }
    ColumnInit(RowMap* pEdgeMap): pMyEdgeMap(pEdgeMap)
    {
    }
};
类ColumnInit{
行映射*常量pMyEdgeMap;
公众:
void运算符()(常数阻塞\u范围和r)常数{
RowMap*pEdgeMap=pMyEdgeMap;
行映射::访问器accessX;
ColMap::访问器访问;
对于(大小n1=r.begin();n1!=r.end();n1++)
{
pEdgeMap->insert(accessX,n1);
对于(int n2=1;n2秒)。插入(accessY,n2));
访问->秒=-1;
}
其他的
{
assert((accessX->second).insert(accessY,n2));
访问->秒=0;
}
}
}
}
ColumnInit(行映射*pEdgeMap):pMyEdgeMap(pEdgeMap)
{
}
};
函数对象通过调用parallel_调用,如下所示:

parallel_for(blocked_range<size_t>(1,64,16), ColumnInit((RowMap*)&mEdges), simple_partitioner());
parallel_for(blocked_range(1,64,16)、columnint((RowMap*)和mEdges)、simple_partitioner());
任何建议或反馈都很好


谢谢

如果要创建64x64表格,请使用blocked_range(1,65,,16)作为并行_的第一个参数。原因是阻塞的_范围表示半开区间,其中包括下限,但不包括上限