hov*_*ovo 5 c++ thread-safety c++11
在c ++ 11中是在<functional>线程安全中声明的哈希函数类对象吗?例如,从多个线程调用此函数是否安全?
size_t hash1(const std::string& s) {
std::hash<std::string> str_hash;
return str_hash(s);
}
Run Code Online (Sandbox Code Playgroud)
或者,如果有一个全局对象std::hash<std::string> str_hash_global;,那么从多个线程调用第二个函数是否安全?
size_t hash2(const std::string& s) {
return str_hash_global(s);
}
Run Code Online (Sandbox Code Playgroud)
标准库承诺,如果您只const在标准库对象上调用限定成员函数,则标准库代码不会导致数据竞争(参见[res.on.data.races]).
标准模板std::hash及其所有允许的特殊化,以及满足Hash要求的任何用户提供的仿函数([hash.requirements])必须具有符合要求的const调用操作符,因此使用库提供的std::hash专业化不应该导致比赛.此外,由于[namespace.std],程序提供的特化必须满足相同的要求.
最后,我想你通常会通过递归吸引const调用来使用无竞争性保证:如果多个线程同时在地图中查找值,他们必须使用地图的const界面来调用上面的库规则,然后是地图只能使用hasher(或私有副本)的常量值,因此它本身只能执行无竞争的哈希计算.在这一点上,是否存在一个活泼的非const调用运算符是不重要的.