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

📌往期推文全新看点(文中附带最新·鸿蒙全栈学习笔记)

①📖 鸿蒙应用开发与鸿蒙系统开发哪个更有前景?

②📖嵌入式开发适不适合做鸿蒙南向开发?看完这篇你就了解了~

③📖 对于大前端开发来说,转鸿蒙开发究竟是福还是祸?

④📖 鸿蒙岗位需求突增!移动端、PC端、IoT到底该怎么选?

⑤📖 记录一场鸿蒙开发岗位面试经历~

⑥📖 持续更新中……


一、 概述

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

二、 源码分析

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

/*
 * 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值