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;}