10a7ce71fSopenharmony_ci# HiSpark WiFi-IoT 套件样例开发--互斥锁(Mutex)
20a7ce71fSopenharmony_ci
30a7ce71fSopenharmony_ci![hihope_illustration](https://gitee.com/hihopeorg/hispark-hm-pegasus/raw/master/docs/figures/hihope_illustration.png)
40a7ce71fSopenharmony_ci
50a7ce71fSopenharmony_ci[HiSpark WiFi-IoT开发套件](https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w5003-23341819265.1.bf644a82Da9PZK&id=622343426064&scene=taobao_shop) 首发于HDC 2020,是首批支持OpenHarmony 2.0的开发套件,亦是官方推荐套件,由润和软件HiHope量身打造,已在OpenHarmony社区和广大OpenHarmony开发者中得到广泛应用。
60a7ce71fSopenharmony_ci
70a7ce71fSopenharmony_ci![wifi_iot](https://gitee.com/hihopeorg/hispark-hm-pegasus/raw/master/docs/figures/2.png)
80a7ce71fSopenharmony_ci
90a7ce71fSopenharmony_ci## 一、Mutex API
100a7ce71fSopenharmony_ci
110a7ce71fSopenharmony_ci| API名称         | 说明                                                     |
120a7ce71fSopenharmony_ci| --------------- | -------------------------------------------------------- |
130a7ce71fSopenharmony_ci| osMutexNew      | 创建并初始化一个互斥锁                                   |
140a7ce71fSopenharmony_ci| osMutexGetName  | 获得指定互斥锁的名字                                     |
150a7ce71fSopenharmony_ci| osMutexAcquire  | 获得指定的互斥锁的访问权限,若互斥锁已经被锁,则返回超时 |
160a7ce71fSopenharmony_ci| osMutexRelease  | 释放指定的互斥锁                                         |
170a7ce71fSopenharmony_ci| osMutexGetOwner | 获得指定互斥锁的所有者线程                               |
180a7ce71fSopenharmony_ci| osMutexDelete   | 删除指定的互斥锁                                         |
190a7ce71fSopenharmony_ci
200a7ce71fSopenharmony_ci## 二、代码分析
210a7ce71fSopenharmony_ci
220a7ce71fSopenharmony_ci全局变量`g_test_value`若同时被多个线程访问,会将其加1,然后判断其奇偶性,并输出日志,如果没有互斥锁保护,线程会被中断导致错误,所以需要创建互斥锁来保护多线程共享区域
230a7ce71fSopenharmony_ci
240a7ce71fSopenharmony_ci```c
250a7ce71fSopenharmony_civoid number_thread(void *arg) {
260a7ce71fSopenharmony_ci    osMutexId_t *mid = (osMutexId_t *)arg;
270a7ce71fSopenharmony_ci    while(1) {
280a7ce71fSopenharmony_ci        if (osMutexAcquire(*mid, 100) == osOK) {
290a7ce71fSopenharmony_ci            g_test_value++;
300a7ce71fSopenharmony_ci            if (g_test_value % 2 == 0) {
310a7ce71fSopenharmony_ci                printf("[Mutex Test] %s gets an even value %d.\r\n", osThreadGetName(osThreadGetId()), g_test_value);
320a7ce71fSopenharmony_ci            } else {
330a7ce71fSopenharmony_ci                printf("[Mutex Test] %s gets an odd value %d.\r\n",  osThreadGetName(osThreadGetId()), g_test_value);
340a7ce71fSopenharmony_ci            }
350a7ce71fSopenharmony_ci            osMutexRelease(*mid);
360a7ce71fSopenharmony_ci            osDelay(5);
370a7ce71fSopenharmony_ci        }
380a7ce71fSopenharmony_ci    }
390a7ce71fSopenharmony_ci}
400a7ce71fSopenharmony_ci```
410a7ce71fSopenharmony_ci
420a7ce71fSopenharmony_ci创建三个线程访问全局变量`g_test_value` ,同时创建一个互斥锁共所有线程使用
430a7ce71fSopenharmony_ci
440a7ce71fSopenharmony_ci```c
450a7ce71fSopenharmony_civoid rtosv2_mutex_main(void *arg) {
460a7ce71fSopenharmony_ci    (void)arg;
470a7ce71fSopenharmony_ci    osMutexAttr_t attr = {0};
480a7ce71fSopenharmony_ci
490a7ce71fSopenharmony_ci    osMutexId_t mid = osMutexNew(&attr);
500a7ce71fSopenharmony_ci    if (mid == NULL) {
510a7ce71fSopenharmony_ci        printf("[Mutex Test] osMutexNew, create mutex failed.\r\n");
520a7ce71fSopenharmony_ci    } else {
530a7ce71fSopenharmony_ci        printf("[Mutex Test] osMutexNew, create mutex success.\r\n");
540a7ce71fSopenharmony_ci    }
550a7ce71fSopenharmony_ci
560a7ce71fSopenharmony_ci    osThreadId_t tid1 = newThread("Thread_1", number_thread, &mid);
570a7ce71fSopenharmony_ci    osThreadId_t tid2 = newThread("Thread_2", number_thread, &mid);
580a7ce71fSopenharmony_ci    osThreadId_t tid3 = newThread("Thread_3", number_thread, &mid);
590a7ce71fSopenharmony_ci
600a7ce71fSopenharmony_ci    osDelay(13);
610a7ce71fSopenharmony_ci    osThreadId_t tid = osMutexGetOwner(mid);
620a7ce71fSopenharmony_ci    printf("[Mutex Test] osMutexGetOwner, thread id: %p, thread name: %s.\r\n", tid, osThreadGetName(tid));
630a7ce71fSopenharmony_ci    osDelay(17);
640a7ce71fSopenharmony_ci
650a7ce71fSopenharmony_ci    osThreadTerminate(tid1);
660a7ce71fSopenharmony_ci    osThreadTerminate(tid2);
670a7ce71fSopenharmony_ci    osThreadTerminate(tid3);
680a7ce71fSopenharmony_ci    osMutexDelete(mid);
690a7ce71fSopenharmony_ci}
700a7ce71fSopenharmony_ci```
710a7ce71fSopenharmony_ci
720a7ce71fSopenharmony_ci
730a7ce71fSopenharmony_ci
740a7ce71fSopenharmony_ci## 三、如何编译
750a7ce71fSopenharmony_ci
760a7ce71fSopenharmony_ci1. 将此目录下的 `mutex.c` 和 `BUILD.gn` 复制到openharmony源码的`applications\sample\wifi-iot\app\iothardware`目录下,
770a7ce71fSopenharmony_ci2. 修改openharmony源码的`applications\sample\wifi-iot\app\BUILD.gn`文件,将其中的 `features` 改为:
780a7ce71fSopenharmony_ci
790a7ce71fSopenharmony_ci```
800a7ce71fSopenharmony_ci    features = [
810a7ce71fSopenharmony_ci        "iothardware:mutex_demo",
820a7ce71fSopenharmony_ci    ]
830a7ce71fSopenharmony_ci```
840a7ce71fSopenharmony_ci
850a7ce71fSopenharmony_ci3. 在openharmony源码顶层目录执行:`python build.py wifiiot`
860a7ce71fSopenharmony_ci
870a7ce71fSopenharmony_ci## 四、运行结果
880a7ce71fSopenharmony_ci
890a7ce71fSopenharmony_ci截取部分运行结果
900a7ce71fSopenharmony_ci
910a7ce71fSopenharmony_ci```
920a7ce71fSopenharmony_ci[Mutex Test]  osMutexNew, create mutex success.
930a7ce71fSopenharmony_ci[Mutex Test]  osThreadNew(Thread_1) success, thread id: 0xe84c4.
940a7ce71fSopenharmony_ciRTOSV2.0_TES[Mutex Test]  Thread_1 gets an odd value 1.
950a7ce71fSopenharmony_ci[Mutex Test]  Thread_2 gets an even value 2.
960a7ce71fSopenharmony_ciT: osThreadNew(Thread_2) success, thread id: 0xe871c.
970a7ce71fSopenharmony_ci[Mutex Test]  osThreadNew(Thread_3) success, thread id: 0xe8910.
980a7ce71fSopenharmony_ci[Mutex Test]  Thread_3 gets an odd value 3.
990a7ce71fSopenharmony_ci[Mutex Test]  Thread_1 gets an even value 4.
1000a7ce71fSopenharmony_ci[Mutex Test]  Thread_2 gets an odd value 5.
1010a7ce71fSopenharmony_ci[Mutex Test]  Thread_3 gets an even value 6.
1020a7ce71fSopenharmony_ci[Mutex Test]  Thread_1 gets an odd value 7.
1030a7ce71fSopenharmony_ci[Mutex Test]  Thread_2 gets an even value 8.
1040a7ce71fSopenharmony_ci[Mutex Test]  Thread_3 gets an odd value 9.
1050a7ce71fSopenharmony_ci[Mutex Test]  osMutexGetOwner, thread id: 0xe8910, thread name: Thread_3.
1060a7ce71fSopenharmony_ci[Mutex Test]  Thread_1 gets an even value 10.
1070a7ce71fSopenharmony_ci[Mutex Test]  Thread_2 gets an odd value 11.
1080a7ce71fSopenharmony_ci[Mutex Test]  Thread_3 gets an even value 12.
1090a7ce71fSopenharmony_ci```
1100a7ce71fSopenharmony_ci
1110a7ce71fSopenharmony_ci### 【套件支持】
1120a7ce71fSopenharmony_ci
1130a7ce71fSopenharmony_ci##### 1. 套件介绍  http://www.hihope.org/pro/pro1.aspx?mtt=8
1140a7ce71fSopenharmony_ci
1150a7ce71fSopenharmony_ci##### 2. 套件购买  https://item.taobao.com/item.htm?id=622343426064&scene=taobao_shop
1160a7ce71fSopenharmony_ci
1170a7ce71fSopenharmony_ci##### 3. 技术资料
1180a7ce71fSopenharmony_ci
1190a7ce71fSopenharmony_ci- Gitee码云网站(OpenHarmony Sample Code等) **https://gitee.com/hihopeorg**
1200a7ce71fSopenharmony_ci
1210a7ce71fSopenharmony_ci- HiHope官网-资源中心(SDK包、技术文档下载)[**www.hihope.org**](http://www.hihope.org/)
1220a7ce71fSopenharmony_ci
1230a7ce71fSopenharmony_ci##### 4. 互动交流
1240a7ce71fSopenharmony_ci
1250a7ce71fSopenharmony_ci- 润和HiHope技术交流-微信群(加群管理员微信13605188699,发送文字#申请加入润和官方群#,予以邀请入群)
1260a7ce71fSopenharmony_ci- HiHope开发者社区-论坛 **https://bbs.elecfans.com/group_1429**
1270a7ce71fSopenharmony_ci- 润和HiHope售后服务群(QQ:980599547)
1280a7ce71fSopenharmony_ci- 售后服务电话(025-52668590)
1290a7ce71fSopenharmony_ci
130