学习
实践
活动
专区
工具
TVP
写文章

C++ 实现线程安全map(OpenHarmony源码实现版)

概述 c++map的并发操作是不安全的,c++里边有红黑树实现的std::map和hash表 unordered_map。 在《C++并发编程实战》一书中的162页提供了一个细粒度锁的MAP数据结构,使用了 boost的shared_mutex (C++14已经支持,C++11没有),那上面的实现代码挺长的。 接上篇欣赏了OpenHarmony源码中实现的ThreadPool的实现,链接在这里: c++的ThreadPool,OpenHarmony源码实现版赏析和使用 这里给出个鸿蒙源码实现的safe_map #define UTILS_BASE_SAFE_MAP_H #include <map> #include <mutex> namespace OHOS { template <typename 这是c++模板泛型的强大之处,不用针对每个类型都实现一遍,复用性更强。且模板是在编译期检查的,也降低的出错的可能性。内部实现上,倒是没啥特别的,就是对相应的操作加了锁。

36010
  • 广告
    关闭

    游戏安全场景解决方案

    基于腾讯20余年的防护技术积累,一站式解决游戏服务端、客户端安全问题

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    面试必问-几种线程安全Map解析

    HashMap线程安全的吗? Java中平时用的最多的Map集合就是HashMap了,它是线程安全的。 看下面两个场景: 1、当用在方法内的局部变量时,局部变量属于当前线程级别的变量,其他线程访问不了,所以这时也不存在线程安全安全的问题了。 2、当用在单例对象成员变量的时候呢? 这时候多个线程过来访问的就是同一个HashMap了,对同个HashMap操作这时候就存在线程安全的问题了。 ? 线程安全Map 为了避免出现场景2的线程安全的问题,不能使用HashMap作为成员变量,要寻求使用线程安全Map,下面来总结下有哪些线程安全Map呢? 3、ConcurrentHashMap - 推荐 private Map<String, Object> map = new ConcurrentHashMap<>(); 这个也是最推荐使用的线程安全

    844100

    浅谈Golang两种线程安全map

    以下文章来源于小梁编程汇 ,作者小梁编程汇 导语 | 在召回排序业务中,由于上游请求量较大,对下游存储服务造成较大压力,业务场景要求高性能和非强一致性,所以我采用golang并发安全k-v缓存开源库进行性能优化 一、Golang map (一)并发读写测试 在Golang中原生map在并发场景下,同时读写是线程安全的,无论key是否一样。 v=5erqWdlhQLA (二)map+读写锁 在官方库sync.map没出来前,Go maps in action推荐的做法是使用map+RWLock,比如定义一个匿名struct变量,其包含mapmap+RWLock的实现方式相比,它做了一些优化:可以无锁访问read map,而且会优先操作read map,倘若只操作read map就可以满足要求(增删改查遍历),那就不用去操作write map 作者简介 clancyliang 腾讯后台开发工程师 腾讯后台开发工程师,个人微信公众号:小梁编程汇,擅长的编程语言有:golang、c、c++、java、python,擅长的领域是后台技术,诸如:计网

    21420

    浅谈Golang两种线程安全map

    golang map 1. 并发读写测试 在golang中原生map 在并发场景下,同时读写是线程安全的,无论key是否一样。 编译时的选项-race,为何能分析出并发问题,详见:go官方博客,文章分析,视频讲解 2. map+读写锁 在官方库sync.map没出来前,Go maps in action推荐的做法是使用map+RWLock sync.map sync.map是用读写分离实现的,其思想是空间换时间。 和map+RWLock的实现方式相比,它做了一些优化:可以无锁访问read map,而且会优先操作read map,倘若只操作read map就可以满足要求(增删改查遍历),那就不用去操作write map 变量介绍 1.1  结构体Map type Map struct { // 互斥锁mu,操作dirty需先获取mu mu Mutex // read是只读的数据结构,访问它无须加锁,sync.map

    1.2K20

    面试官:map为什么是非线程安全的?

    这就是矛与盾的关系,go 语言的设计者认为,在大部分场景中,对 map 的操作都非线程安全的; 我们不可能为了那小部分的需求,而牺牲大部分人的性能。 所以如果我们要使用线程安全map 的话,就需要做一些调整了。 那 go 语言中我们要使用线程安全map,该怎么操作呢? 非线程安全 map 的 panic 首先我们先来看下,map 如果不注意线程安全会报什么错! go 语言官方其实也为我们提供了一个线程安全map,就在 sync 包里面。 用他里面的 map 也是线程安全的。 这个 map 使用起来,就没有基础的 map 方便了,写值的时候得通过 Store 方法,读的时候使用方法 Load 来读取。

    71150

    Golang中slice和map线程安全问题

    什么是线程安全? 多个线程在并行访问同一个对象时,线程安全的代码通过同步机制保证各个线程都可以正常且正确的执行,且都可以获得正确的结果,不会出现数据污染等情况,就表示这个对象是线程安全的。 2. slice与map线程安全问题 首先明确一点,在多线程的情况下,slice和map默认都是线程安全的 2.1 slice线程安全问题 看一下下面的这个例子 var w sync.WaitGroup 至于是用互斥锁sync.Mutex还是用读写锁sync.RWMutex,这个看具体情况而定,如果读的场景远大于写的场景,用读写锁性能更好 2.3 map线程安全问题 看一下下面这个例子 var wg sync.WaitGroup ,并提示fatal error: concurrent map writes,原因和slice一样,没有对修改操作加锁,导致发生资源竞争,出现了所谓的线程安全问题。 为什么官方不直接取消原生map改用sync.Map呢,因为大部分情况下人们并不会在多个goroutine的情况下使用map,所以没有线程安全问题,就不需要加锁,这个时候原生map速度是最快的,如果全部换成

    74040

    C++ 语言】线程安全队列 ( 条件变量 | 线程调度 )

    线程简单使用 ---- 线程简单使用流程 : ① 线程方法准备 : 定义一个方法 , 主要使用其 方法名称 和 返回值 ; //线程的主方法 , 类似于 Java 中的 run 方法 , C++ 中方法名随意 , 0); 更多详细内容 ( 如线程属性设置等细节 ) 参考 下面的博客 : 【C++ 语言】线程 ( 线程创建方法 | 线程标识符 | 线程属性 | 线程属性初始化 | 线程属性销毁 | 分离线程 | 线程调度策略 | 线程优先级 | 线程等待 ) 【C++ 语言】Visual Studio 配置 POSIX 线程 ( Windows 不支持 POSIX | 配置文件下载 | 库文件说明 | include "SafeQueue.h" using namespace std; //线程安全队列 SafeQueue<int> safeQueue; //向线程安全队列中添加数据 void* > i; safeQueue.push(i); cout << "存储数据到线程安全队列 : " << i << endl; } return 0; } //从线程安全队列中取出数据

    2220

    C++11:基于std::unordered_map和共享锁构建线程安全map

    https://blog.csdn.net/10km/article/details/52072061 前一篇博客《C++11:基于std::queue和std::mutex构建一个线程安全的队列 》中,实现了一个线程安全的队列,本文说说如何实现一个线程安全map。 所以在实现线程安全map时,我没有选择使用std::mutex控制所有的操作为独占访问,而是用RWLock来控制map对象的访问,RWLock是我以前自己写的一个类,将线程对资源的访问分为读取操作和写入操作两类 关于RWLock的源码及更详细的说明参见我的博客《无锁编程:c++11基于atomic实现共享读写锁(写优先)》 有了RWLock,基于std::unordered_map实现线程安全map就比较简单了 { inline namespace mt{ /* * 基于std::unordered_map实现线程安全map * 禁止复制构造函数 * 禁止复制赋值操作符 * 允许移动构造函数 * 禁止移动赋值操作符

    6.9K10

    ​让我们来看看,多线程下的Map是如何实现线程安全

    ;而jdk1.8中改用尾插法,避免了这个情况,但是其put操作在多线程环境下会发生覆盖,导致线程安全。 使用HashTable类 使用Collections.synchronizedMap(Map)创建线程安全map 使用ConcurrentHashMap类 那么接下来我们就来细聊一下这三种方式: HashTable jdk1.2中引入了Collections.synchronizedMap(Map),这种相对较灵活的方式来保证Map线程安全。 通过源码我们可以看出每个Segment都继承ReentranLock(可重入锁)并单独加锁,因此每次进行加锁操作时锁住的就是一个Segment,这样我们只要保证每个Segment都是线程安全的,就能保证全局的线程安全 保证线程安全机制:JDK1.7采用segment的分段锁机制实现线程安全,其中segment继承自ReentrantLock。JDK1.8采用CAS+Synchronized保证线程安全

    13210

    c 线程安全的单例模式-详解C++实现线程安全的单例模式

    这种模式,在多线程环境下肯定是线程安全的,因为不存在多线程实例化的问题。    这种模式,并非是线程安全的,因为多个线程同时调用()方法,就可能导致有产生多个实例。要实现线程安全,就必须加锁。    然而这并不是必须的c 线程安全的单例模式,于是又对()方法进行改进 template T* singleton::GetInstance() { if( m_instance == NULL) ); m_instance = ptmp; } pthread_mutex_unlock(&mutex); } return m_instance; }   到这里在懒汉模式下,也就可以保证线程安全了 下面是使用实现的线程安全的懒汉单例模式 template class singleton { protected: singleton(){}; private: singleton(const

    8210

    如何设计并实现一个线程安全Map ?(下篇)

    在上篇中,我们已经讨论过如何去实现一个 Map 了,并且也讨论了诸多优化点。在下篇中,我们将继续讨论如何实现一个线程安全Map。说到线程安全,需要从概念开始说起。 ? 在语言原生就自带线程安全 Map 的语言中,它们的原生底层实现都不是通过单纯的加锁来实现线程安全的,比如 Java 的 ConcurrentHashMap,Go 1.9 新加的 sync.map。 接下来就让我们来看看如何用 CAS 实现一个线程安全的高性能 Map 。 官方是 sync.map 有如下的描述: 这个 Map线程安全的,读取,插入,删除也都保持着常数级的时间复杂度。 多个 goroutines 协程同时调用 Map 方法也是线程安全的。该 Map 的零值是有效的,并且零值是一个空的 Map线程安全Map 在第一次使用之后,不允许被拷贝。 中包含 map 中必须要互斥量 mu 保护才能线程安全的部分。

    1.3K70

    如何设计并实现一个线程安全Map ?(上篇)

    C、C++ 中的 STL 就实现了 Map,JavaScript 中也有 Map,Java 中有 HashMap,Swift 和 Python 中有 Dictionary,Go 中有 Map,Objective-C 上面这些 Map 都是线程安全的么?答案是否定的,并非全是线程安全的。那如何能实现一个线程安全Map 呢?想回答这个问题,需要先从如何实现一个 Map 说起。 一. 在探究如何实现一个线程安全Map 之前,先把之前说到个一些亮点优化点,小结一下。 在 Redis 中,采用增量式扩容的方式处理哈希冲突。 Go 1.9 版本以后,Map 原生就已经支持线程安全。 (鉴于单篇文章的长度,线程安全部分全部放到下篇去讲,稍后更新下篇) ---- Reference: 《算法与数据结构》 《Redis 设计与实现》 xxHash 字符串hash函数 General Purpose

    1K20

    关注

    腾讯云开发者公众号
    10元无门槛代金券
    洞察腾讯核心技术
    剖析业界实践案例
    腾讯云开发者公众号二维码

    相关产品

    • 弹性 MapReduce

      弹性 MapReduce

      弹性MapReduce (EMR)结合云技术和  Hadoop等社区开源技术,提供安全、低成本、高可靠、可弹性伸缩的云端托管 Hadoop 服务。您可以在数分钟内创建安全可靠的专属 Hadoop 集群,以分析位于集群内数据节点或 COS 上的 PB 级海量数据……

    相关资讯

    热门标签

    活动推荐

    扫码关注腾讯云开发者

    领取腾讯云代金券