OpenHarmony源码分析之分布式软总线:trans_service模块(3)/线程同步锁管理

一、 概述

在分布式软总线提供的数据传输服务中,为了提高处理效率,使用了多线程并发处理的机制,因此就会引入线程同步的问题,所谓线程同步,即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态,实现线程同步的方法有很多,临界区对象就是其中一种。trans_service模块的线程同步管理是基于互斥锁实现的,而对于不同的底层内核设备,互斥锁的调用库有所不同。如果是基于Linux内核的设备,调用的是Posix标准的pthread库中的互斥锁实现方法;如果是基于LiteOS内核的设备,调用的是CMSIS-RTOS库里面的互斥锁实现方法。

DD一下: 欢迎大家关注公众号<程序猿百晓生>,可以了解到一下知识点。

erlang 复制代码
1.OpenHarmony开发基础
2.OpenHarmony北向开发环境搭建
3.鸿蒙南向开发环境的搭建
4.鸿蒙生态应用开发白皮书V2.0 & V3.0
5.鸿蒙开发面试真题(含参考答案) 
6.TypeScript入门学习手册
7.OpenHarmony 经典面试题(含参考答案)
8.OpenHarmony设备开发入门【最新版】
9.沉浸式剖析OpenHarmony源代码
10.系统定制指南
11.【OpenHarmony】Uboot 驱动加载流程
12.OpenHarmony构建系统--GN与子系统、部件、模块详解
13.ohos开机init启动流程
14.鸿蒙版性能优化指南
.......

二、 源码分析

互斥锁的管理主要是在trans_lock.c中实现的,对该文件的分析如下:

arduino 复制代码
/*
 * Copyright (c) 2020 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#include "trans_lock.h"
#if defined(__LITEOS_M__) || defined(__LITEOS_RISCV__)//如果是基于LITEOS_M或者LITEOS_RISCV内核的设备,处理线程同步方式是不一样的
#include <cmsis_os.h>
#else
#include <pthread.h>
#endif
#include "data_bus_error.h"
#define BUS_WAIT_FOREVER 0xFFFFFFFF
#if defined(__LITEOS_M__) || defined(__LITEOS_RISCV__)
static osMutexId_t g_sessionManagerLock;//基于LITEOS_M或者LITEOS_RISCV内核的全局管理互斥锁变量
#else
static pthread_mutex_t g_sessionManagerLock;//全局互斥锁变量,基于Linux内核
#endif
/*
函数功能:初始化用于TCP通信管理器的锁,对于不同的内核,有不同的加锁解锁方式
函数参数:无
函数返回值:
    成功:返回0
    失败:返回错误码
详细:
*/
int InitTcpMgrLock(void)
{
#if defined(__LITEOS_M__) || defined(__LITEOS_RISCV__)//基于LITEOS_M或者LITEOS_RISCV内核的设备
    if (g_sessionManagerLock != NULL) {
        return DBE_SUCCESS;
    }
    g_sessionManagerLock = osMutexNew(NULL);//创建并初始化一个互斥锁对象
#else
    pthread_mutex_init(&g_sessionManagerLock, NULL);//创建并初始化一个互斥锁对象
#endif
    return DBE_SUCCESS;
}
/*
函数功能:获取用于TCP通信管理器的锁,即请求互斥锁。对于不同的内核,有不同的加锁解锁方式
函数参数:无
函数返回值:
    成功:返回0
    失败:返回错误码
详细:
*/
int GetTcpMgrLock(void)
{
#if defined(__LITEOS_M__) || defined(__LITEOS_RISCV__)//基于LITEOS_M或者LITEOS_RISCV内核的设备
    if (g_sessionManagerLock == NULL) {
        return -DBE_INNER_ERROR;
    }
    osStatus_t ret = osMutexAcquire(g_sessionManagerLock, BUS_WAIT_FOREVER);//请求互斥锁
    if (ret != osOK) {
        return -DBE_INNER_ERROR;
    }
#else
    pthread_mutex_lock(&g_sessionManagerLock);//请求互斥锁
#endif
    return DBE_SUCCESS;
}
/*
函数功能:释放用于TCP通信管理器的锁,对于不同的内核,有不同的加锁解锁方式
函数参数:无
函数返回值:
    成功:返回0
    失败:返回错误码
详细:
*/
int ReleaseTcpMgrLock(void)
{
#if defined(__LITEOS_M__) || defined(__LITEOS_RISCV__)//基于LITEOS_M或者LITEOS_RISCV内核的设备
    if (g_sessionManagerLock == NULL) {
        return -DBE_INNER_ERROR;
    }
    osStatus_t ret = osMutexRelease(g_sessionManagerLock);//释放由 osMutexAcquire 获取的互斥锁
    if (ret != osOK) {
        return -DBE_INNER_ERROR;
    }
#else
    pthread_mutex_unlock(&g_sessionManagerLock);//释放由 pthread_mutex_lock 获取的互斥锁
#endif
    return DBE_SUCCESS;
}
相关推荐
李李李勃谦1 小时前
Flutter 框架跨平台鸿蒙开发 - 星空日记
flutter·华为·harmonyos
2401_839633911 小时前
鸿蒙flutter第三方库适配 - 看板应用
flutter·华为·harmonyos
Rick19931 小时前
Redis 分布式锁:核心使用场景
数据库·redis·分布式
pingao1413782 小时前
简易无线雨量计+物联网:低成本实现降雨实时监测
物联网
纸鸢|2 小时前
从“一锤子买卖“到“持续价值共生“:物联网软件产品如何做到“叫好又叫座“
java·物联网·struts
轻口味3 小时前
HarmonyOS 6 自定义人脸识别模型10:基于MindSpore Lite框架的自定义人脸识别功能实现
华为·harmonyos
提子拌饭1333 小时前
生命组学架构下的细胞分化与基因突变生存模拟器:基于鸿蒙Flutter的情景树渲染与状态溢出防御
flutter·华为·架构·开源·harmonyos
墨北小七4 小时前
小说大模型的分布式训练——数据并行架构设计与实现
分布式
HarmonyOS_SDK4 小时前
【FAQ】HarmonyOS SDK 闭源开放能力 —Media Library Kit
harmonyos
qq_297574675 小时前
【Kafka系列·进阶第一篇】生产可靠性实战:死信队列+幂等性+集群扩容+灾备切换
分布式·kafka