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

前端之家收集整理的这篇文章主要介绍了c – tbb :: concurrent_unordered_multimap中的错误?即使是单线程,条目也会丢失前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的理解是,如果我只使用一个线程,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 100
tbb count 1
std size 100
std count 10

如果我删除myhash,我会得到正确的结果.然而,我理解散列图的方式是,只要函数在x == y时返回相同的值,可怕的散列函数应该只影响性能,而不是正确性.

解决方法

MDSL,

问题出在internal_insert()中. i / 10工作的原因是i%10没有的是项目被插入到multimap中的顺序,这是bug的一个症状. internal_insert没有进行键相等比较,因此每次插入都在列表的末尾(所有哈希都相等,所以方法只是走到了尽头.)当使用i / 10时,所有的0键都插入了,然后是所有1个键,依此类推. internal_equal_range确实检查键的相等性,并正确地找到该范围的结尾.

非常感谢您找到错误.我正在添加一个“退化哈希”单元测试,我仍然需要弄清楚为什么我们的验证器没有捕获无序列表.

问候,
克里斯

(对不起,我得到了关键等式错误…)

猜你在找的C&C++相关文章