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;
}
相关推荐
刘某的Cloud1 小时前
rabbitmq常用命令
linux·运维·分布式·rabbitmq·系统
鸿蒙开发工程师—阿辉1 小时前
一键多环境构建——用 Hvigor 玩转 HarmonyOS Next
ubuntu·华为·harmonyos
NapleC2 小时前
HarmonyOS NEXT:多设备的自由流转
华为·harmonyos
慧一居士5 小时前
Zookeeper HA集群搭建
分布式·zookeeper
冼紫菜5 小时前
[特殊字符] 分布式定时任务调度实战:XXL-JOB工作原理与路由策略详解
分布式
好想有猫猫7 小时前
【Redis】服务端高并发分布式结构演进之路
数据库·c++·redis·分布式·缓存
鸿蒙布道师7 小时前
鸿蒙NEXT开发正则工具类RegexUtil(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
Huang兄7 小时前
鸿蒙-使用Charles抓包
harmonyos
CZIDC7 小时前
[特殊字符][特殊字符] HarmonyOS相关实现原理聊聊![特殊字符][特殊字符]
华为·harmonyos
别说我什么都不会8 小时前
【仓颉三方库】算法类—— flexSearch4cj
harmonyos