
基于OpenHarmony标准系统的C++公共基础类库案例:SafeMap 原创
1、程序简介
该程序是基于OpenHarmony的C++公共基础类库的安全关联容器:SafeMap。
OpenHarmony提供了一个线程安全的map实现。SafeMap在STL map基础上封装互斥锁,以确保对map的操作安全。
本案例主要完成如下工作:
- 创建1个子线程,负责每秒调用EnsureInsert()插入元素;
- 创建1个子线程,负责每秒调用Insert()插入元素;
- 创建1个子线程,负责每秒调用Erase()删除元素;
- 创建1个子线程,负责每秒调用FindOldAndSetNew()替换元素的值;
- 主线程等待上述线程结束,Iterate()和Find()查看所有元素;
- 主线程等待上述线程结束,清空SafeMap,并调用IsEmpty()查看是否确实是空。
该案例已在凌蒙派-RK3568开发板验证过,如需要源代码,请参考:
2、基础知识
C公共基础类库为标准系统提供了一些常用的C开发工具类,包括:
- 文件、路径、字符串相关操作的能力增强接口
- 读写锁、信号量、定时器、线程增强及线程池等接口
- 安全数据容器、数据序列化等接口
- 各子系统的错误码相关定义
2.1、添加C++公共基础类库依赖
修改需调用模块的BUILD.gn,在external_deps或deps中添加如下:
一般而言,我们只需要填写"c_utils:utils"即可。
2.2、SafeMap头文件
C++公共基础类库的safemap头文件在://commonlibrary/c_utils/base/include/safe_map.h
可在源代码中添加如下:
2.3、OHOS::SafeMap接口说明
2.3.1、SafeMap
构造函数。
参数说明:
参数名称 | 类型 | 参数说明 |
---|---|---|
rhs | SafeMap | 复制SafeMap的类对象 |
2.3.2、~SafeMap
析构函数。
2.3.3、Clear
删除map中存储的所有键值对。
2.3.4、EnsureInsert
在map中插入元素。
参数说明:
参数名称 | 类型 | 参数说明 |
---|---|---|
key | K | 需要插入元素的关键字 |
value | V | 需要插入元素的值 |
2.3.5、Erase
删除map中键为key的键值对。
参数说明:
参数名称 | 类型 | 参数说明 |
---|---|---|
key | K | 需要删除元素的关键字 |
2.3.6、Find
在map中查找元素。
参数说明:
参数名称 | 类型 | 参数说明 |
---|---|---|
key | K | 需要查找元素的关键字 |
value | V | 需要查找元素的值 |
返回值说明:
类型 | 返回值说明 |
---|---|
bool | true表示成功,false表示失败 |
2.3.7、FindOldAndSetNew
在map中查找元素并将key对应的oldValue
替换为newValue
。
参数说明:
参数名称 | 类型 | 参数说明 |
---|---|---|
key | K | 需要替换元素的关键字 |
oldValue | V | 需要替换元素的原始值 |
newValue | V | 需要替换元素的新值 |
返回值说明:
类型 | 返回值说明 |
---|---|
bool | true表示成功,false表示失败 |
2.3.8、Insert
在map中插入新元素。
参数说明:
参数名称 | 类型 | 参数说明 |
---|---|---|
key | K | 需要插入元素的关键字 |
value | V | 需要插入元素的原始值 |
返回值说明:
类型 | 返回值说明 |
---|---|
bool | true表示成功,false表示失败 |
2.3.9、IsEmpty
判断map是否为空。
返回值说明:
类型 | 返回值说明 |
---|---|
bool | true表示空,false表示非空 |
2.3.10、Iterate
遍历map中的元素。
参数说明:
参数名称 | 类型 | 参数说明 |
---|---|---|
callback | SafeMapCallBack | 遍历执行函数 |
2.3.11、operator=
SafeMap赋值。
参数说明:
参数名称 | 类型 | 参数说明 |
---|---|---|
rhs | SafeMap& | 被赋值的SafeMap类对象 |
返回值说明:
类型 | 返回值说明 |
---|---|
SafeMap | 赋值的SafeMap类对象 |
2.3.12、operator[]
SafeMap索引。
参数说明:
参数名称 | 类型 | 参数说明 |
---|---|---|
key | K& | 元素的关键字 |
返回值说明:
类型 | 返回值说明 |
---|---|
V& | 返回元素的值 |
2.3.13、Size
获取map的size大小。
返回值说明:
类型 | 返回值说明 |
---|---|
int | map的size大小 |
3、程序解析
3.1、创建编译引导
在上一级目录BUILD.gn文件添加一行编译引导语句。
"a26_utils_safemap:utils_safemap",
该行语句表示引入 参与编译。
3.2、创建编译项目
创建a26_utils_safemap目录,并添加如下文件:
3.3、创建BUILD.gn
编辑BUILD.gn文件。
注意:
(1)BUILD.gn中所有的TAB键必须转化为空格,否则会报错。如果自己不知道如何规范化,可以:
3.4、创建源代码
3.4.1、创建SafeMap
3.4.2、创建线程池并设置
3.4.3、启动4个子线程,并等待结束
调用AddTask()添加子线程,并调用Stop()等待所有子进程结束。
3.4.4、编写SafeMap.EnsureInsert()插入元素
3.4.5、编写SafeMap.Insert()插入元素
3.4.6、编写SafeMap.Erase()删除元素
3.4.7、编写SafeMap.FindOldAndSetNew()替换元素的值
3.4.8、编写枚举所有元素
主要分为如下两种方法:
(1)调用SafeMap.Iterate()
(2)调用SafeMap.Find()
3.4.9、清空SafeMap
4、编译步骤
进入OpenHarmony编译环境,运行命令:
5、运行结果
