首页 > 编程语言 >C++实现一个线程安全的map

C++实现一个线程安全的map

时间:2023-05-07 10:44:51浏览次数:40  
标签:std map const lock C++ 线程 key mutex

本文是使用ChatCPT生成的,最终的代码使用起来没问题。代码是通过两轮对话完善的,后面把对话合并后跑不出理想效果就没尝试了。

第一轮对话

请求

c++11实现一个线程安全的map,使用方法与std::map保持一致,实现[]运算符

回复

以下是一个简单的线程安全的map实现,可以使用[]运算符来访问和修改map中的元素:

//代码省略,后面一起给出

该实现使用std::map作为底层数据结构,并使用std::mutex保证线程安全。在[]运算符中,使用std::lock_guard<std::mutex>来自动加锁和解锁。其他方法也都加了锁来保证线程安全。

示例用法:

//代码省略,后面一起给出

第一轮对话

请求

实现{}初始化,可以获取所有key

回复

为了实现{}初始化并获取所有key,我们需要对ThreadSafeMap进行一些修改和扩展。具体来说,我们需要在构造函数中接受一个std::initializer_list参数,并使用它来初始化map中的元素。同时,我们需要添加一个keys方法,它返回一个包含所有key的std::vector。以下是修改后的ThreadSafeMap实现:

//代码省略,后面一起给出

在构造函数中,我们使用std::initializer_list来接受{}初始化列表,并使用for循环将其转换为map中的元素。在keys方法中,我们遍历所有元素,并将其key添加到std::vector中返回。

完整代码

ThreadSafeMap.h代码如下:

#include <map>
#include <mutex>
#include <vector>
#include <initializer_list>

template<typename K, typename V>
class ThreadSafeMap {
public:
    ThreadSafeMap() {}

    ThreadSafeMap(std::initializer_list<std::pair<K, V>> init_list) {
        for (auto& pair : init_list) {
            map_[pair.first] = pair.second;
        }
    }

    V& operator[](const K& key) {
        std::lock_guard<std::mutex> lock(mutex_);
        return map_[key];
    }

    bool insert(const K& key, const V& value) {
        std::lock_guard<std::mutex> lock(mutex_);
        auto result = map_.insert(std::make_pair(key, value));
        return result.second;
    }

    bool erase(const K& key) {
        std::lock_guard<std::mutex> lock(mutex_);
        return map_.erase(key);
    }

    bool contains(const K& key) const {
        std::lock_guard<std::mutex> lock(mutex_);
        return map_.find(key) != map_.end();
    }

    size_t size() const {
        std::lock_guard<std::mutex> lock(mutex_);
        return map_.size();
    }

    std::vector<K> keys() const {
        std::lock_guard<std::mutex> lock(mutex_);
        std::vector<K> result;
        for (auto& pair : map_) {
            result.push_back(pair.first);
        }
        return result;
    }

private:
    std::map<K, V> map_;
    mutable std::mutex mutex_;
};

示例用法:

ThreadSafeMap<int, std::string> map{{1, "one"}, {2, "two"}, {3, "three"}};

// 使用[]运算符来访问和修改map中的元素
map[1] = "ONE";
map[4] = "four";
std::cout << map[1] << std::endl; // 输出 "ONE"

// 使用insert方法插入新元素
map.insert(5, "five");

// 使用erase方法删除元素
map.erase(2);

// 使用contains方法判断是否包含某个元素
if (map.contains(1)) {
    std::cout << "Map contains key 1" << std::endl;
}

// 使用size方法获取元素个数
std::cout << "Map size: " << map.size() << std::endl;

// 使用keys方法获取所有key
auto keys = map.keys();
for (auto& key : keys) {
    std::cout << key << std::endl;
}

输出结果为:

ONE
Map contains key 1
Map size: 4
1
3
4
5

标签:std,map,const,lock,C++,线程,key,mutex
From: https://www.cnblogs.com/timefiles/p/17378985.html

相关文章

  • C/C++网络编程笔记Socket
    https://www.bilibili.com/video/BV11Z4y157RY/?vd_source=d0030c72c95e04a14c5614c1c0e6159b上面链接是B站的博主教程,源代码来自上面视频,侵删,这里只是做笔记,以供复习和分享。上一篇博客我记录了配置环境并且跑通了,以及碰到的一些问题这篇文章是对socket的代码解读笔记。先把服务端......
  • C++
    #include<iostream>usingnamespacestd;intmain(intargc,char**argv){ stringname,month,day,age,hobby; cin>>name>>month>>day>>age>>hobby; cout<<"我叫"<<name<<endl<<"我是"<&......
  • C++内存序
    先后一致次序(memory_order_seq_cst)如果程序服从先后一致次序,就简单地把一切事件视为按先后顺序发生,其操作与这种次序保持一致。假设在多线程程序的全部原子类型的实例上,所有的操作都保持先后一致,name它们将按某种特定次序改由单线程执行,则俩个程序的操作毫无区别。缺点:在弱保......
  • golang hashmap
    packagemainimport("fmt")constHASH_BUCKET_SIZE=3//1023typehash_nodestruct{keyinterface{}valinterface{}next*hash_node}//hashbuckettosavenodeaddressvarhash_bucket[HASH_BUCKET_SIZE]*hash_nodefunc......
  • RUL预测常用数据集--C-MAPSS Dataset介绍
    C-MAPSS是针对航空发动机剩余寿命预测的数据集。该数据集由NASA(美国国家航空航天局)发布,包含了四个不同类型的航空发动机的传感器数据,以及相应的故障模式和剩余寿命数据,如表1所示。表1InformationoftheC-MAPSSdataset.DatasetFD001FD002FD003FD004Engineunit......
  • HashMap设置初始容量一直都用错了?
    1背景今天在代码审查的时候,发现一位离职的同事留下了这样一串代码:Map<String,String>map=newHashMap<>((int)(list.size()/0.75F+1));第一反应是:又在炫技,又在搞这些花里胡哨的东西。但是看到0.75的我却陷入了沉思,稍微深入了解过Map的应该都知道,Map中有个属性,叫做负载因......
  • Windows亚克力特效代码实现(Dev c++可以编译通过)
    #include<windows.h>#include<dwmapi.h>//定义一个枚举类型,表示不同的窗口组合状态enumAccentState{ACCENT_DISABLED=0,ACCENT_ENABLE_GRADIENT=1,ACCENT_ENABLE_TRANSPARENTGRADIENT=2,ACCENT_ENABLE_BLURBEHIND=3,ACCENT_ENABLE_ACR......
  • 【jmap】jmap命令详情
    简介1、jmap能够打印给定Java进程、核心文件或远程DEBUG服务器的共享对象内存映射或堆内存的详细信息。2、如果给定的进程运行在64位虚拟机上,则必须指定-J-d64选项,例如jmap-J-d64-heappid。3、jmap可能在未来的JDK版本中删除。可用于内存溢出,泄露等情况的内存分析使用......
  • c++结构体写入文档
    //#include<iostream>//#include<fstream>//usingnamespacestd;// structstudent// {// charname[20];// charsex[20];// intage;// };// intmain()// {// constintnum=2;// studentstu[num];// stringpath="1.txt";// fstreamf......
  • C++17 解构绑定
    在python中,加入我们有一个函数返回了两个数值,如:defgetData(x,y): returnx,y那么我们在使用这个函数时只需要使用两个新变量去接收函数返回值就可以:a,b=getData(4,5)但是对于C++来说就没有这么方便了,比如一个函数要返回多个数通常会把他们封装成一个pair或者vector容器......