c – tbb :: concurrent_unordered_multimap中的错误?即使是单线程,条目也会丢失

c – tbb :: concurrent_unordered_multimap中的错误?即使是单线程,条目也会丢失,第1张

概述我的理解是,如果我只使用一个线程,tbb :: concurrent_unordered_multimap的行为应该像std :: unordered_multimap.但是,在此示例中,它不会: #include "tbb/concurrent_unordered_map.h"#include <iostream>#include <unordered_map>struct myhash 我的理解是,如果我只使用一个线程,tbb :: concurrent_unordered_multimap的行为应该像std :: unordered_multimap.但是,在此示例中,它不会:
#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中的错误?即使是单线程,条目也会丢失所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1238233.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存