问题描述
我正在尝试为性能关键型应用程序制作一个哈希表 (unordered_map
) 线程安全的。我正在使用 OpenMP 来处理多线程。我尝试的第一个解决方案是对哈希表 critical
进行所有访问,但这最终降低了线程的性能,以至于并行版本不再更快。然后我想到了以下想法:制作 100 个单独的哈希表,初始化为空集,并将它们存储在一个数组中。使用一些哈希函数将键映射到范围[0,1,...,99]
,并将值存储在相应的哈希表中。下面是一个伪代码来演示这个想法:
auto hash_vec = vector<unordered_map<int,int> >(100);
int prime = 534161472029; // some big prime
int rand_int = rand(); // random int used for
int simple_hash(int v) {
return (rand_int * v) % prime;
}
void safe_write(int key,int val) {
int h = simple_hash(key) % 100;
hash_vec[h][key] = val; // must be made safe
}
int safe_read() {
int h = simple_hash(key) % 100;
int val = hash_vec[h][key]; // must be made safe
return val;
}
所以这个想法是,如果 h
的值不同,就不会有任何竞争条件。例如,如果 simple_hash(k1)
不等于 simple_hash(k2)
,同时调用 safe_write(k1,v1)
和 safe_write(k2,v2)
不会导致任何线程等待。这样的事情可能吗?如果没有,是否有更好的方法来确保性能不会受到太大影响?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)