当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《c++11std::hash函数对象类线程安全》经验,为你挑选了1个好方法。

在c ++ 11中是在线程安全中声明的哈希函数类对象吗?例如,从多个线程调用此函数是否安全?

size_t hash1(const std::string& s) {
    std::hash str_hash;
    return str_hash(s); 
}

或者,如果有一个全局对象std::hash str_hash_global;,那么从多个线程调用第二个函数是否安全?

size_t hash2(const std::string& s) {
    return str_hash_global(s); 
}

Kerrek SB.. 6

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

标准模板std::hash及其所有允许的特殊化,以及满足Hash要求的任何用户提供的仿函数([hash.requirements])必须具有符合要求的const调用操作符,因此使用库提供的std::hash专业化不应该导致比赛.此外,由于[namespace.std],程序提供的特化必须满足相同的要求.

最后,我想你通常会通过递归吸引const调用来使用无竞争性保证:如果多个线程同时在地图中查找值,他们必须使用地图的const界面来调用上面的库规则,然后是地图只能使用hasher(或私有副本)的常量值,因此它本身只能执行无竞争的哈希计算.在这一点上,是否存在一个活泼的非const调用运算符是不重要的.



1> Kerrek SB..:

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

标准模板std::hash及其所有允许的特殊化,以及满足Hash要求的任何用户提供的仿函数([hash.requirements])必须具有符合要求的const调用操作符,因此使用库提供的std::hash专业化不应该导致比赛.此外,由于[namespace.std],程序提供的特化必须满足相同的要求.

最后,我想你通常会通过递归吸引const调用来使用无竞争性保证:如果多个线程同时在地图中查找值,他们必须使用地图的const界面来调用上面的库规则,然后是地图只能使用hasher(或私有副本)的常量值,因此它本身只能执行无竞争的哈希计算.在这一点上,是否存在一个活泼的非const调用运算符是不重要的.

推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有