RDA 互斥锁的使用
在多线程下,在同一时间内,可能有多个线程在操作。如果没有同步机制,那么很难保证每个线程操作的正确性。
1、互斥锁概念:
互斥锁提供一个可以在同一时间,只让一个线程访问临界资源的的操作接口。互斥锁(Mutex)是个提供线程同步的基本锁。上锁后,其他的线程如果想要锁上,那么会被阻塞,直到锁释放后。
如果,在锁释放后,有多个线程被阻塞,那么,所有的被阻塞的线程会被设为可执行状态。第一个执行的线程,取得锁的控制权,上锁。其他的线程继续阻塞。
2、互斥锁系统原型
互斥锁的系统原型为:pthread_mutex_t,在用互斥锁之前,必须要初始化互斥锁,可以调用pthread_mutex_init;或者是PTHREAD_MUTEX_INITIALZER(仅用于静态分配内存)如果我们动态分配互斥锁(比如,用malloc),那么,在释放内存之前,必须调用pthread_mutex_destroy;
下面为互斥锁初始化和销毁的函数原型:
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr); int pthread_mutex_destroy(pthread_mutex_t *mutex); int pthread_mutex_lock(pthread_mutex_t *mutex); int pthread_mutex_unlock(pthread_mutex_t *mutex);
3、CEC处理互斥锁的使用
./aps/application/daemon/src/umf_cec.c pthread_mutex_t as_mutex; //获取锁,即初始化
void CECTV_Init(CECTV_ModualCfg_t *pCEC_ModualCfg)
{
CEC_t *pcec = cec_GetHandle(); if (pcec->bCECExecuted)
return;
pcec->menuState = MS_DEACTIVATED;
pcec->LogAddr = g_pKMFShareData->CecLogAddr;
pcec->inputSource = g_pKMFShareData->CecPwrOnSrc;
#ifdef CONFIG_HDMI_ALL_PORT_TERMINATION_ON
pcec->bActiveSrcCheck = TRUE;
#endif
//bCHScanStop = TRUE;
//HPStatus = FALSE;
CecAudioARC = FALSE;
//cecHdmiPortStatus = ptv->pKMFShareData->iHDMIStatus;
//bAudioModeOn = ptv->pMenuSetting->CecAudioARC;
bAudioModeOn = FALSE; UmfHandler_Register(cec_CecdHandler);
cecd_enable();
pcec->bCECExecuted = TRUE; pthread_mutex_init(&as_mutex, NULL); //申请锁 }
//使用锁
HRESULT cec_ReportActiveSource(CEC_t *pcec, CECDMSG_NOTICECECD *pnotice)
{
CECTV_MessageBody_t stEvt; UMFDBG(,"Receive %s, toSrc=%d, inputSrc=%d, LogAddr=%d, viewonState=%d\n",__FUNCTION__, pnotice->toSrc,
pcec->inputSource, pnotice->active_logAddr, pnotice->viewon_state);
pcec->menuState = MS_DEACTIVATED; if (pcec->inputSource != pnotice->toSrc)
{
if (bBlockActiveSrc)
{
//bBlockActiveSrc = FALSE;
return S_OK;
}
else
{
bBlockActiveSrc = TRUE;
pthread_mutex_lock(&as_mutex);
pthread_cond_signal(&as_cond);
pthread_mutex_unlock(&as_mutex);
}
}
}
4、NVM互斥锁 API
int Cmd_NVMInital(void)
{
if (gFlashWriteMutex == NULL)
{
GL_MutexCreate("NVMWriteMutex", &gFlashWriteMutex);
if (gFlashWriteMutex == NULL)
{
return -;
}
} return ;
} int Cmd_NVMUninital(void)
{
if (gFlashWriteMutex != NULL)
{
GL_MutexLock(gFlashWriteMutex);
GL_MutexDelete(gFlashWriteMutex);
gFlashWriteMutex = NULL;
}
return ;
} int Cmd_NVMLOCK(void)
{
GL_MutexLock(gFlashWriteMutex); return ;
} int Cmd_NVMUNLOCK(void)
{
GL_MutexUnlock(gFlashWriteMutex); return ;
}
在读写FLASH时原子操作,使用使用互斥锁
INT8 Cmd_FlashWrite(UINT32 destAddr, UINT32 srcAddr, UINT32 size)
{
FlashControl_t flashctrl = {};
INT8 retval; flashctrl.op = KMF_OP_SET;
flashctrl.destAddr = destAddr;
flashctrl.srcAddr = srcAddr;
flashctrl.size = size;
GL_MutexLock(gFlashWriteMutex);
retval = ioctl(kmfdev, KMF_IOC_FLASHCTRL, &flashctrl);
GL_MutexUnlock(gFlashWriteMutex); return retval;
}
RDA 互斥锁的使用的更多相关文章
- ucos实时操作系统学习笔记——任务间通信(互斥锁)
想讲一下ucos任务间通信中的mutex,感觉其设计挺巧妙,同sem一样使用的是event机制实现的,代码不每一行都分析,因为讲的没邵贝贝老师清楚,主要讲一下mutex的内核是如何实现的.可以理解互斥 ...
- 多线程之互斥锁(By C++)
首先贴一段win32API实现的多线程的代码,使用CreateThread实现,如果不要传参数,就把第四个参数设为NULL #include<Windows.h> #include< ...
- 简单的JavaScript互斥锁
去年有几个项目需要使用JavaScript互斥锁,所以写了几个类似的,这是其中一个: //Published by Indream Luo //Contact: indreamluo@qq.com / ...
- Java多线程系列--“JUC锁”02之 互斥锁ReentrantLock
本章对ReentrantLock包进行基本介绍,这一章主要对ReentrantLock进行概括性的介绍,内容包括:ReentrantLock介绍ReentrantLock函数列表ReentrantLo ...
- 异步与并行~ReaderWriterLockSlim实现的共享锁和互斥锁
返回目录 在System.Threading.Tasks命名空间下,使用ReaderWriterLockSlim对象来实现多线程并发时的锁管理,它比lock来说,性能更好,也并合理,我们都知道lock ...
- GIL与线程互斥锁
GIL 是解释器级别的锁,是限制只有一个原生线程运行,防止多个原生线程之间修改底层的共享数据.而线程互斥锁是防止多个线程同时修改python内存空间的共享数据.
- c# 多线程 --Mutex(互斥锁)
互斥锁(Mutex) 互斥锁是一个互斥的同步对象,意味着同一时间有且仅有一个线程可以获取它. 互斥锁可适用于一个共享资源每次只能被一个线程访问的情况 函数: //创建一个处于未获取状态的互斥锁 Pub ...
- linux c学习笔记----互斥锁属性
转自:http://lobert.iteye.com/blog/1762844 互斥锁属性 使用互斥锁(互斥)可以使线程按顺序执行.通常,互斥锁通过确保一次只有一个线程执行代码的临界段来同步多个线程. ...
- Linux线程-互斥锁pthread_mutex_t
在线程实际运行过程中,我们经常需要多个线程保持同步.这时可以用互斥锁来完成任务:互斥锁的使用过程中,主要有pthread_mutex_init,pthread_mutex_destory,pthrea ...
随机推荐
- LeetCode(29)Divide Two Integers
题目 Divide two integers without using multiplication, division and mod operator. If it is overflow, r ...
- LeetCode(4)Median of Two Sorted Arrays
题目 There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the ...
- Spring核心技术(八)——Spring自动装载的注解
本文针对自动装载的一些注解进行描述. 基于注解的容器配置 @Required注解 @Required注解需要应用到Bean的属性的setter方法上面,如下面的例子: public class Sim ...
- reactNative 打包那些事儿
我们项目测试时一般是debug版本,打包上线,一般是release版本,所以在测试和打包时会走不同的方法,如上图所示. 在debug版本中,会走我们本地服务器,也就是自己电脑上的服务.在release ...
- 用bootstrap_table实现html 表格翻页
资料网址 百度经验:HTML表格分页,table分页怎么做? 官网(下载链接和官方教程) (右上角可选语言) 文档 以下内容基本摘自官网 用法 1.下载资料 官网下载: 下下来长这样: 其中src里面 ...
- Session与Token的区别
1. 为什么要有session的出现?答:是由于网络中http协议造成的,因为http本身是无状态协议,这样,无法确定你的本次请求和上次请求是不是你发送的.如果要进行类似论坛登陆相关的操作,就实现不了 ...
- HDU4463-Outlets,简单最小生成树。1A水过~~
Outlets ...
- ORACLE ASH/AWR
(一) ASH 用户在ORACLE数据库中执行操作时,必然要创建相应的连接和会话,其中,所有当前的会话信息都保存在动态性能视图V$SESSION中,通过该视图,DBA可以查看用户实际执行的操作,或者当 ...
- Android 4.4.2上与BLE 蓝牙锁设备的通讯
Android从4.3(Api level 18)开始支持BLE的开发,本文记录了Android 4.4.2设备与BLE设备通讯的流程. 权限需求: <uses-permission andro ...
- 【ZJOI2017 Round1练习】D8T2 sequence(DP)
题意: 思路: #include <algorithm> #include <iostream> #include <cstring> #include <c ...