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;
}
相关推荐
倔强的石头1062 小时前
把 Typst 搬上开源鸿蒙 PC:一次“干净”的移植记录
华为·开源·harmonyos
程序员大阳3 小时前
副队长大数据教程(6)--四节点分布式集群搭建
大数据·分布式·集群·搭建·四节点
马六六i3 小时前
目前知名的分布式Ai数智共享商城哪家好
人工智能·分布式
黄鹂鸟科技4 小时前
进销存系统设计要点:从采购计划、库存监控到成本核算
后端·物联网·系统架构
大鹏说大话4 小时前
分布式事务怎么选型?2PC、TCC、SAGA、本地消息表一次讲清
分布式
梦想不只是梦与想5 小时前
鸿蒙 预览数据模拟:Hamock
harmonyos·模拟数据·hamock
szxinmai主板定制专家5 小时前
ZYNQ PL+PS 架构拆解|工业自动化与电力物联网高速数据采集、预处理与协议上云
arm开发·人工智能·物联网·fpga开发·数据采集卡·rk3576
话梅姐姐呀5 小时前
IOT -- 设备入网与注册
大数据·网络·人工智能·物联网·iot
星恒讯工业路由器5 小时前
蜂窝物联网模组选型实践:4G Cat.1、Cat.4 与 5G RedCap 的工程对比
网络·物联网·redcap·工业物联网·cat.1·cat.4·cat.1 bis
Eloudy5 小时前
ASTRA-sim 3.0:通过高保真GPU和基础设施建模进行下一级分布式机器学习模拟
人工智能·分布式·机器学习