• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 增强信号量功能
2
3## 概述
4
5### 简介
6
7信号量是一个具有原子性的计数器,可以作一把锁,以实现互斥、同步等功能;在多线程环境下使用,可以实现临界区代码不被并发调用或者限制并发的数量。信号量根据种类又可以分为有名信号量和无名信号量。
8
9`#include <semaphore_ex.h>`
10
11Inherits from OHOS::NoCopyable
12
13## 涉及功能
14
15#### 接口说明
16
17### OHOS::NamedSemaphore
18
19| 返回值 | 名称                                                         |
20| ------ | ------------------------------------------------------------ |
21|        | **NamedSemaphore**(size_t size)<br/>构造函数(指定信号量初始值) |
22|        | **NamedSemaphore**(const std::string&, size_t)<br/>构造函数(指定信号量名字和初始值) |
23|        | **~NamedSemaphore**()<br/>析构函数                           |
24| bool   | **Create**()<br/>创建并初始化有名信号量                      |
25| bool   | **Unlink**()<br/>将有名信号量文件从系统中删除                |
26| bool   | **Open**()<br/>打开一个已经创建的有名信号量文件              |
27| bool   | **Close**()<br/>关闭有名信号量                               |
28| bool   | **Wait**()<br/>等待/获取信号量(信号量 -1)                    |
29| bool   | **TryWait**()<br/>等待/获取信号量(信号量 -1)的接口;非阻塞版 |
30| bool   | **TimedWait**(const struct timespec& ts)<br/>等待/获取信号量(信号量 -1);指定阻塞时间版 |
31| bool   | **Post**()<br/>释放信号量(信号量 +1)                         |
32| int    | **GetValue**() const<br/>获取信号的值                        |
33
34### OHOS::Semaphore
35
36| 返回值 | 名称                                                     |
37| ------ | -------------------------------------------------------- |
38|        | **Semaphore**(int value = 1) : count_(value)<br>构造函数 |
39| void   | **Wait**()<br/>等待/获取信号量(信号量 -1)                |
40| void   | **Post**()<br/>释放信号量(信号量 +1)                     |
41
42## 使用示例
43
441. 示例代码
45
46```c++
47#include <functional>
48#include <iostream>
49#include <chrono>
50#include "../include/semaphore_ex.h"
51
52using namespace OHOS;
53using namespace std;
54
55constexpr int COUNT_MAX = 3;
56constexpr int THREAD_NUM = 2 * COUNT_MAX;
57
58class WorkSpace
59{
60public:
61    WorkSpace(const string &name, int maxSize) : sema(name, maxSize), count(0), max(0)
62    {
63    }
64
65    bool CreateSema()
66    {
67        return sema.Create();
68    }
69
70    ~WorkSpace()
71    {
72        sema.Close();
73        sema.Unlink();
74    }
75
76    void Enter()
77    {
78        sema.Wait();
79        count++;
80        this_thread::sleep_for(chrono::microseconds(1));
81        max = max > count ? max : count;
82        count--;
83        sema.Post();
84    }
85
86    bool Check()
87    {
88        if (COUNT_MAX >= max) {
89            return true;
90        }
91
92        return false;
93    }
94
95    bool CloseAndUnlink()
96    {
97        return sema.Close() && sema.Unlink();
98    }
99
100    int GetCount()
101    {
102        return count;
103    }
104
105    int GetMax()
106    {
107        return max;
108    }
109
110private:
111    NamedSemaphore sema;
112    int count;
113    int max;
114};
115
116int main()
117{
118    WorkSpace ws("mysem", COUNT_MAX);
119    if (ws.CreateSema()) {
120        cout << "NamedSemaphore created success!" << endl;
121    } else {
122        return 0;
123    }
124    thread threads[THREAD_NUM];
125    for (int i = 0; i < THREAD_NUM; i++) {
126        threads[i] = thread(&WorkSpace::Enter, ref(ws));
127    }
128
129    for (int i = 0; i < THREAD_NUM; i++) {
130        threads[i].join();
131    }
132
133    if (ws.Check()) {
134        cout << "Semaphore test success!" <<endl;
135    }
136
137    cout << "max: " << ws.GetMax() << " count: " << ws.GetCount() << endl;
138
139    ws.CloseAndUnlink();
140}
141```
142
1432. 测试用例编译运行方法
144
145- 测试用例代码参见base/test/unittest/common/utils_semaphore_test.cpp
146
147- 使用开发者自测试框架,使用方法参见:[开发自测试执行框架-测试用例执行](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)
148
149- 使用以下具体命令以运行`semaphore_ex.h`对应测试用例
150```bash
151run -t UT -tp utils -ts UtilsSemaphoreTest
152```
153
154## 常见问题
155
156