10a7ce71fSopenharmony_ci# HiSpark WiFi-IoT 套件样例开发--互斥锁(Mutex) 20a7ce71fSopenharmony_ci 30a7ce71fSopenharmony_ci 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 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