gpt4 book ai didi

c++11 std::hash 函数对象类线程安全

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:14:13 25 4
gpt4 key购买 nike

在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);
}

最佳答案

标准库 promise ,如果您在标准库对象上调用const限定的成员函数,标准库代码不会导致数据竞争(cf. [res.on.data.races]).

标准模板 std::hash,以及它所有允许的特化,以及满足 Hash 要求的任何用户提供的仿函数([hash. requirements]) 必须有一个 const-qualified call operator 由于要求,因此使用库提供的 std::hash 特化不应导致竞争。此外,由于 [namespace.std],程序提供的特化必须满足相同的要求。

最后,我想您通常会通过递归调用 const 调用来使用无竞争保证:如果多个线程并发地在映射中查找值,它们必须使用映射的 const 接口(interface)来调用上述库规则,但是映射只能使用哈希器的常量值(或私有(private)拷贝),因此它本身只能执行无竞争哈希计算。在这一点上,是否存在活泼的非常量调用运算符是无关紧要的。

关于c++11 std::hash 函数对象类线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34385854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com