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