首页
学习
活动
专区
工具
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 #include namespace OHOS { template <typename...这是c++模板泛型的强大之处,不用针对每个类型都实现一遍,复用性更强。且模板是在编译期检查的,也降低的出错的可能性。内部实现上,倒是没啥特别的,就是对相应的操作加了锁。

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

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

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

1.2K100

浅谈Golang两种线程安全map

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

45520

浅谈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

2.5K20

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

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

1.4K50

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速度是最快的,如果全部换成

2.8K40

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

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

1.2K21

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 * 禁止复制构造函数 * 禁止复制赋值操作符 * 允许移动构造函数 * 禁止移动赋值操作符

8.4K10

​让我们来看看,多线程下的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保证线程安全

39310

C++map & set

(1)map 的介绍 我们先看一下 map 的文档介绍:map 文档介绍 ....map 中通过键值访问单个元素的速度通常比 unordered_map 容器慢,但 map 允许根据顺序对元素进行直接迭代(即对map中的元素进行迭代时,可以得到一个有序的序列)。...map 支持下标访问符,即在 [] 中放入 key,就可以找到与 key 对应的 value。 map 通常被实现为二叉搜索树(更准确的说:平衡二叉搜索树(红黑树))。...总结: map 中的的元素是键值对 map 中的 key 是唯一的,并且不能修改 默认按照小于的方式对 key 进行比较 map 中的元素如果用迭代器去遍历,可以得到一个有序的序列 map 的底层为平衡搜索树...使用时与map包含的头文件相同: 四、map 和 set 的练习 1.

8610

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

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

1.9K70

Golang实例讲解,map并发读写的线程安全性问题

先上实例代码,后面再来详细讲解 /** * 并发编程,map线程安全性问题,使用互斥锁的方式 */ package main import ( "sync" "time"...所以也看出来,Go在对待线程安全性问题方面,对slice还是更加宽容的,对map则更加严格,这也是在并发编程时对我们提出了基本的要求。...将上面的代码稍微做些修改,对 datai=i 的前后增加上 muMap.Lock() 和 muMap.Unlock() ,也就保证了多线程并行的情况下,遇到冲突时有互斥锁的保证,避免出现线程安全性问题。...这里,我们再来探讨一个问题,如何保证map线程安全性? 上面我们是通过 muMap 这个互斥锁来保证的。...下面是实例代码: /** * 并发编程,map线程安全性问题,使用channel的方式 */ package main import ( "time" "fmt" ) var dataCh

44851

如何设计并实现一个线程安全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

1.7K20

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

80610
领券