#include "tbb/concurrent_unordered_map.h"#include <iostream>#include <unordered_map>struct myhash { size_t operator()(const int& a) const { return 1; }};int main() { tbb::concurrent_unordered_multimap<int,int,myhash> tbbIDx; std::unordered_multimap<int,myhash> stdIDx; for(int i = 0; i < 100; ++i) { tbbIDx.insert(std::make_pair(i % 10,i)); stdIDx.insert(std::make_pair(i % 10,i)); } std::cout << "tbb size " << tbbIDx.size() << std::endl; std::cout << "tbb count " << tbbIDx.count(0) << std::endl; std::cout << "std size " << stdIDx.size() << std::endl; std::cout << "std count " << stdIDx.count(0) << std::endl;}
结果如下:
tbb size 100tbb count 1std size 100std count 10
如果我删除myhash,我会得到正确的结果.然而,我理解散列图的方式是,只要函数在x == y时返回相同的值,可怕的散列函数应该只影响性能,而不是正确性.
解决方法 mdsL,问题出在internal_insert()中. i / 10工作的原因是i%10没有的是项目被插入到multimap中的顺序,这是BUG的一个症状. internal_insert没有进行键相等比较,因此每次插入都在列表的末尾(所有哈希都相等,所以方法只是走到了尽头.)当使用i / 10时,所有的0键都插入了,然后是所有1个键,依此类推. internal_equal_range确实检查键的相等性,并正确地找到该范围的结尾.
非常感谢您找到错误.我正在添加一个“退化哈希”单元测试,我仍然需要弄清楚为什么我们的验证器没有捕获无序列表.
问候,
克里斯
(对不起,我得到了关键等式错误…)
总结以上是内存溢出为你收集整理的c – tbb :: concurrent_unordered_multimap中的错误?即使是单线程,条目也会丢失全部内容,希望文章能够帮你解决c – tbb :: concurrent_unordered_multimap中的错误?即使是单线程,条目也会丢失所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)