Files
phs_v1.0.1.0/commonlibrary/c_utils/docs/zh-cn/c-utils-guide-safeMap.md
2024-09-27 19:16:49 +08:00

103 lines
2.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 线程安全map
## 概述
### 简介
提供了一个线程安全的map实现。SafeMap在STL map基础上封装互斥锁以确保对map的操作安全。
## 涉及功能
### class SafeMap
#### 接口说明
|返回类型 |名称 |
| -------------- | -------------- |
| | **SafeMap**() |
| | **SafeMap**(const SafeMap& rhs) |
| | **~SafeMap**() |
| void | **Clear**()<br>删除map中存储的所有键值对。 |
| void | **EnsureInsert**(const K& key, const V& value)<br>在map中插入元素。 |
| void | **Erase**(const K& key)<br>删除map中键为key的键值对。 |
| bool | **Find**(const K& key, V& value)<br>在map中查找元素。 |
| bool | **FindOldAndSetNew**(const K& key, V& oldValue, const V& newValue)<br>在map中查找元素并将key对应的`oldValue`替换为`newValue`。 |
| bool | **Insert**(const K& key, const V& value)<br>在map中插入新元素。 |
| bool | **IsEmpty**()<br>判断map是否为空。 |
| void | **Iterate**(const SafeMapCallBack& callback)<br>遍历map中的元素。 |
| SafeMap& | **operator=**(const SafeMap& rhs) |
| V& | **operator[]**(const K& key) |
| int | **Size**()<br>获取map的size大小。 |
## 使用示例
1. 示例代码(伪代码)
```c++
#include <thread>
#include <iostream>
#include <functional>
#include "../include/safe_map.h"
using namespace OHOS;
using namespace std;
constexpr int THREAD_NUM = 5;
thread threads[THREAD_NUM * 2];
SafeMap<int, string> sm;
bool InsertHandler(const int& key, const string& value)
{
if (sm.Insert(key,value)) {
cout << "Insert key: " << key << endl;
return true;
} else {
return false;
}
}
bool FindHandler(const int& key, string& value)
{
if (sm.Find(key,value)) {
cout << "Find key: " << key << " with value: " << value << endl;
return true;
} else {
return false;
}
}
int main()
{
for (int i = 0; i < THREAD_NUM; i++) {
string name = "Thread" + to_string(i);
threads[i] = thread(&InsertHandler, i, name);
}
for (int i = 0; i < THREAD_NUM; i++) {
string out;
threads[i + THREAD_NUM] = thread(&FindHandler, i, ref(out));
}
this_thread::sleep_for(chrono::milliseconds(300));
for (int i = 0; i < 2 * THREAD_NUM; i++) {
threads[i].join();
}
if (sm.Size() == THREAD_NUM) {
cout << "Insert to SafeMap success!" << endl;
}
}
```
2. 测试用例编译运行方法
- 测试用例代码参见base/test/unittest/common/utils_safe_map_test.cpp
- 使用开发者自测试框架,使用方法参见:[开发自测试执行框架-测试用例执行](https://gitee.com/openharmony/testfwk_developer_test#%E6%B5%8B%E8%AF%95%E7%94%A8%E4%BE%8B%E6%89%A7%E8%A1%8C)
- 使用以下具体命令以运行`safe_map.h`对应测试用例
```bash
run -t UT -tp utils -ts UtilsSafeMapTest
```