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

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


一、 概述

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

二、 源码分析

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

#include "trans_lock.h"//如果是基于LITEOS_M或者LITEOS_RISCV内核的设备,处理线程同步方式是不一样的#if defined(__LITEOS_M__) || defined(__LITEOS_RISCV__)#include #else#include #endif#include "data_bus_error.h"#define BUS_WAIT_FOREVER 0xFFFFFFFF#if defined(__LITEOS_M__) || defined(__LITEOS_RISCV__)//基于LITEOS_M或者LITEOS_RISCV内核的全局管理互斥锁变量static osMutexId_t g_sessionManagerLock;#elsestatic pthread_mutex_t g_sessionManagerLock;//全局互斥锁变量,基于Linux内核#endif/*函数功能:初始化用于TCP通信管理器的锁,对于不同的内核,有不同的加锁解锁方式函数参数:无函数返回值:    成功:返回0    失败:返回错误码详细:*/int InitTcpMgrLock(void){//基于LITEOS_M或者LITEOS_RISCV内核的设备#if defined(__LITEOS_M__) || defined(__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){//基于LITEOS_M或者LITEOS_RISCV内核的设备#if defined(__LITEOS_M__) || defined(__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){//基于LITEOS_M或者LITEOS_RISCV内核的设备#if defined(__LITEOS_M__) || defined(__LITEOS_RISCV__)    if (g_sessionManagerLock == NULL) { return -DBE_INNER_ERROR;    }    //释放由 osMutexAcquire 获取的互斥锁    osStatus_t ret = osMutexRelease(g_sessionManagerLock);    if (ret != osOK) { return -DBE_INNER_ERROR;    }#else//释放由 pthread_mutex_lock 获取的互斥锁    pthread_mutex_unlock(&g_sessionManagerLock);#endif    return DBE_SUCCESS;}