concurrent_has_map是TBB中设计的符合stl规范的防止并发访问的hash table模板类,主要使用格式为:concurrent_hash_map
如下是一个自定义hashcompare结构体,该结构体定义了hash值的产生函数及两个关键key值的比较:
struct MyHashCompare
{
static size_t hash(const string & x)
{
size_t h = 0;
for ( const char* s= x.c_str(); *s; ++s)
{
h = (h*17)^*s;
}
return h;
}
static bool equal( const string & x, const string & y)
{
return x==y;
}
};
typedef concurrent_hash_map StringTable;
随机生成字符串函数如下(生成a-Z之间的字符,然后组成字符串):
string generateRandomString()
{
char str[9];
char c1 = rand()%26 + 65;
char c2 = rand()%26 + 65;
char c3 = rand()%26 + 65;
char c4 = rand()%26 + 65;
char c5 = rand()%26 + 65;
char c6 = rand()%26 + 65;
char c7 = rand()%26 + 65;
char c8 = rand()%26 + 65;
sprintf(str, "%c%c%c%c%c%c%c%c",c1,c2,c3,c4,c5,c6,c7,c8);
return string(str);
}
用StringTable进行输入数据处理的结构体:
struct Tally
{
StringTable& m_table;
Tally(StringTable & table_):m_table(table_){}
void operator()(const blocked_rangerange) const
{
for ( string* p = range.begin(); p!=range.end(); ++p)
{
StringTable::accessor a;
m_table.insert(a, *p);
a->second += 1;
}
}
};
测试例子:
void concurrent_hash_map_test()
{
tick_count t0 = tick_count::now();
const size_t N = 100000;
string *Data = new string[N];
for ( int i=0; i(Data, Data+N, 100), Tally(table));
// printf("Table.size=%d\n", table.size());
int count = 0;
for ( StringTable::iterator i= table.begin(); i!=table.end(); ++i)
{
printf("size=%d,%s %d\n",table.size(), i->first.c_str(), i->second);
if ( i->second ==1 )
{
count ++;
}
}
printf("出现一次的个数:%d\n", count);
tick_count t1 = tick_count::now();
printf("程序执行时间为:%g seconds\n", (t1-t0).seconds());
delete[]Data;
// string str = generateRandomString();
// printf("%s", str.c_str());
}
直接在main中调用该函数就可以运行了。在本例中,没有对concurrent_hash_map的结构或源码进行剖析,熟悉stl库的童鞋可以很轻松的应用该类,想了解更多的资料,可以查阅tbb源码或参考inel threading building blocks outfitting c++ for multi-core processor parallelisn。