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 ...
随机推荐
- 树莓派2-SSH
树莓派3系统SSH是默认关闭的, 将SD卡插入linux, 在root 分区, 修改/etc/rc.local 在exit 0前增加一行 /ect/init.d/ssh start 将SD卡插回树莓派 ...
- assert.deepStrictEqual()
assert.deepStrictEqual(actual, expected[, message]) 一般情况下等同于 assert.deepEqual(),但有两个例外.首先,原始值是使用全等运算 ...
- *** 红包书用法 及 ubuntu全局配置
使用教程 http://go.wasai.org/sswiki https://home.maysoul.com/wiki/doku.php?id=shadowsocks ubuntu使用教程 htt ...
- Webdriver元素定位3(CSS)
Selenium极力推荐使用CSS 定位,而不是XPath来定位元素,原因是CSS 定位比XPath 定速度快,语法也更加简洁. CSS常用定位方法 选择器 例子 描述 .class .intro c ...
- Codeforces Round #364 (Div. 2),只有A与B
A. Cards time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...
- Django:(5)分页器 & forms组件
Django组件:分页器 目录结构: urls.py from django.contrib import admin from django.urls import path from app01 ...
- [thrift] thrift基本原理及使用
参考文章RPC 基本原理与 Apach Thrift 初体验 RPC基本原理 RPC(Remote Procedure Call),远程过程调用,大部分的RPC框架都遵循如下三个开发步骤: 1. 定义 ...
- HDU 5644 King's Pliot【费用流】
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5644 题意: 每天都有p[i]个飞行员进行阅兵,飞行员只工作一天. m个休假公式,花费tt[i]元让 ...
- 网页js粘贴截图
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 饭卡-HDU2546(01背包)
http://acm.hdu.edu.cn/showproblem.php?pid=2546 饭卡 Time Limit: 5000/1000 MS (Java/Others) Memory L ...