在 c++11 中声明的哈希函数类对象<functional>
线程安全?例如,从多个线程调用此函数是否安全?
size_t hash1(const std::string& s) {
std::hash<std::string> str_hash;
return str_hash(s);
}
或者,如果有一个全局对象std::hash<std::string> str_hash_global;
,那么从多个线程调用第二个函数是否安全?
size_t hash2(const std::string& s) {
return str_hash_global(s);
}
标准库承诺,如果您only call const
- 标准库对象上的限定成员函数,标准库代码不会导致数据争用(参见[res.on.data.races])。
标准模板std::hash
,以及所有允许的专业化,以及任何用户提供的满足Hash
要求([hash.requirements])必须有一个const
- 由于要求,需要合格的调用运算符,因此使用库提供的std::hash
专业化不应该引起竞争。此外,由于 [namespace.std],程序提供的专业化必须满足相同的要求。
最后,我想您通常会通过递归地调用来使用无竞争保证const
调用:如果多个线程同时在映射中查找值,它们必须使用映射的const
接口来调用上述库规则,但映射只能使用哈希器的常量值(或私有副本),因此它本身只能执行无竞争的哈希计算。此时是否存在活泼的非常量调用运算符是无关紧要的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)