线程安全的查找表

template<typename Key, typename Value, typename Hash = std::hash<Key>>
class ThreadsafeLookupTable
{
private:
    class BucketType
    {
    private:
        typedef std::pair<Key, Value> bucketValue;
        typedef std::list<bucketValue> bucketData;
        typedef typename bucketData::iterator bucketIterator;

        bucketData                   data;
        mutable boost::shared_mutex mutex;

        bucketIterator findEntryFor(Key const& key) const
        {
            return std::find_if(data.cbegin (), data.cend (),
                                [&](bucketValue const& item)
                                {return item.first == key;});
        }
    public:
        Value valueFor(Key const& key, Value const& defaultValue) const
        {
            boost::shared_lock<boost::shared_mutex> lock(mutex);
            auto const foundEntry = findEntryFor (key);
            return (foundEntry == data.cend ()? defaultValue : foundEntry->second);
        }

        void addOrUpdate(Key const& key, Value const& value)
        {
            std::unique_lock<boost::shared_mutex> lock(mutex);
            auto const foundEntry = findEntryFor (key);
            if (foundEntry == data.cend ()){
                data.push_back ({key, value});
            }
            else{
                foundEntry->second = value;
            }
        }

        void removeMapping(Key const& key)
        {
            std::unique_lock<boost::shared_mutex> lock(mutex);
            auto const foundEntry = findEntryFor (key);
            if (foundEntry != data.cend ()){
                data.erase (foundEntry);
            }
        }
    };

    std::vector<std::unique_ptr<BucketType>> buckets;
    Hash hasher;

    BucketType& getBucket(Key const& key) const
    {
        auto const bucketIdnex = hasher(key) % buckets.size ();
        return *buckets[bucketIdnex];
    }

public:
    ThreadsafeLookupTable(const ThreadsafeLookupTable&) = delete;
    ThreadsafeLookupTable& operator=(const ThreadsafeLookupTable&) = delete;

    typedef Key   KeyType;
    typedef Value MappedValue;

    ThreadsafeLookupTable(size_t numBuckets = 19, Hash const& hasher_ = Hash()):
        buckets(std::vector<std::unique_ptr<BucketType>>(numBuckets)),
        hasher(hasher_)
    {
        for (size_t i = 0; i < numBuckets; ++i){
            buckets[i].reset(std::make_unique<BucketType>());
        }
    }

    Value valueFor(Key const& key, Value const& defaultValue)
    {
        getBucket (key).valueFor (key, defaultValue);
    }

    void addOrUpdateMapping(Key const& key, Value const& value)
    {
        getBucket (key).addOrUpdate (key, value);
    }

    void removeMapping(Key const& key)
    {
        getBucket (key).removeMapping (key);
    }
};
时间: 2024-10-20 16:16:00

线程安全的查找表的相关文章

OpenCV-怎样扫描图像、查找表和运行效率的测定

1.目标 在本文中我们要回答下面这4个问题: (1)怎样遍历图像中的每一个像素: (2)OpenCV中矩阵值怎样存储: (3)怎样测试我们的算法的效率: (4)什么是查找表,我们为什么要是用它? 2 关于测试demo 这里,我们考虑一种非常简单的色彩降低方法.我们已经知道,使用了unsigned char类型的矩阵项最高可以拥有256种不同的值.那么对于3通道图像来说,那就有16,000,000种值.处理这么多的像素差,对于我们的算法性能是个很大的考验.但是,有时候,只处理其中的一部分就能得到相

数据结构:静态查找表

数据结构:静态查找表(C语言版) 1.写在前面 ?从查找说起: 在英汉字典中查找某个英文单词的中文解释:在新华字典中查找某个汉字的读音.含义:在对数表.平方根表中查找某个数的对数.平方根:邮递员送信件要按收件人的地址确定位置等等. 从计算机.计算机网络中查找特定的信息,就需要在计算机中存储包含该特定信息的表.查找是许多程序中最消耗时间的一部分.因而,一个好的查找方法会大大提高运行速度. ?先讨论静态查找表: 静态查找表应该是查找中最为简单的.仅仅是在固定的表中对元素的查找,而不涉及修改表中的元素

JAVASE02-Unit05: 集合操作 —— 查找表

Unit05: 集合操作 -- 查找表 使用该类测试自定义元素的集合排序 package day05; /** * 使用该类测试自定义元素的集合排序 * @author adminitartor * */ public class Point implements Comparable<Point>{ private int x; private int y; public Point(int x, int y) { super(); this.x = x; this.y = y; } pub

算法学习之查找算法:静态查找表(2)有序表查找

如果静态查找表是一个有序表,则可以使用折半查找. 折半查找的过程是:先确定待查记录所在的范围(区间),然后逐步缩小范围直到找到或找不到该记录为止.折半查找过程是以处于区间中间位置记录的关键字和给定值比较,若相等,则查找成功,若不等,则缩小范围,直至新的区间中间位置记录的关键字等于给定值或者查找区间的大小小于零时(表明查找不成功)为止. 关键字key与表中某一元素array[i]比较,有3种情况: 1.key==array[i],查找成功 2.key > array[i],待查找元素可能的范围是a

静态查找表:顺序查找、折半查找、分块查找

引言: 除去各种线性和非线性的数据结构外.另一种在实际应用中大量使用的数据结构--查找表.查找表是由同一类型的数据元素构成的集合. 对查找表常常进行的操作有:1.查找某个"特定的"数据元素是否在查找表中:2.检索某个"特定的"数据元素的各种属性:3.在查找表中插入一个数据元素:4.从查找表中删去某个数据元素.对查找表仅仅作前两种统称为"查找"的操作,则称此类查找表为静态查找表. 若在查找过程中同一时候插入查找表中不存在的数据元素,或者从查找表中删

Lua查找表元素过程(元表、__index方法是如何工作的)(转载)

文章来源于 Lua查找表元素过程(元表.__index方法是如何工作的) Lua的表本质其实是个类似HashMap的东西,其元素是很多的Key-Value对,如果尝试访问了一个表中并不存在的元素时,就会触发Lua的一套查找机制,也是凭借这个机制,才能够实现“面向对象”的. 举例说明: tempTable = {} print(tempTable.memberA) --这里试图打印tempTable并不存在的成员memberA 执行结果:nil输出为nil的原因很简单,tempTable中并没有m

动态查找表

1.动态查找表的特点:表结构本身是在查找过程中动态生成的,即对于给定值key,若表中存在其关键字等于key的记录,则查找成功返回,否则插入关键字等于key的记录. 1 //---------------抽象数据类型动态查找表的定义--------------------- 2 ADT DynamicSearchTable{ 3 数据对象D:D是具有相同特性的数据元素的集合.各个数据元素均含有类型相同,可惟一标识数据元素的关键字. 4 数据关系R:数据元素同属一个集合. 5 基本操作P: 6 In

算法学习之查找算法:静态查找表(1)顺序表查找

引言: 对查找表一般的操作有:1.查询某个"特定的"数据元素是否在查找表中:2.检索某个"特定的"数据元素的各种属性:3.在查找表中插入一个数据元素:4.从查找表中删去某个数据元素. 静态查找表的操作只包括两种:1.查找某个"特定的"数据元素是否在查找表中:2.检索某个"特定的"数据元素的各种属性: 静态查找表又有四种表现形式:顺序表的查找.有序表的查找.静态树的查找.索引顺序表的查找. 静态查找涉及的关键字类型和数据元素类型

9-12-哈希查找表/散列表-查找-第9章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第9章  查找 - 哈希查找表/散列表 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Base.c        相关测试数据下载  链接? 数据包