在多线程下,在同一时间内,可能有多个线程在操作。如果没有同步机制,那么很难保证每个线程操作的正确性。

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 互斥锁的使用的更多相关文章

  1. ucos实时操作系统学习笔记——任务间通信(互斥锁)

    想讲一下ucos任务间通信中的mutex,感觉其设计挺巧妙,同sem一样使用的是event机制实现的,代码不每一行都分析,因为讲的没邵贝贝老师清楚,主要讲一下mutex的内核是如何实现的.可以理解互斥 ...

  2. 多线程之互斥锁(By C++)

    首先贴一段win32API实现的多线程的代码,使用CreateThread实现,如果不要传参数,就把第四个参数设为NULL #include<Windows.h> #include< ...

  3. 简单的JavaScript互斥锁

    去年有几个项目需要使用JavaScript互斥锁,所以写了几个类似的,这是其中一个: //Published by Indream Luo //Contact: indreamluo@qq.com / ...

  4. Java多线程系列--“JUC锁”02之 互斥锁ReentrantLock

    本章对ReentrantLock包进行基本介绍,这一章主要对ReentrantLock进行概括性的介绍,内容包括:ReentrantLock介绍ReentrantLock函数列表ReentrantLo ...

  5. 异步与并行~ReaderWriterLockSlim实现的共享锁和互斥锁

    返回目录 在System.Threading.Tasks命名空间下,使用ReaderWriterLockSlim对象来实现多线程并发时的锁管理,它比lock来说,性能更好,也并合理,我们都知道lock ...

  6. GIL与线程互斥锁

    GIL 是解释器级别的锁,是限制只有一个原生线程运行,防止多个原生线程之间修改底层的共享数据.而线程互斥锁是防止多个线程同时修改python内存空间的共享数据.

  7. c# 多线程 --Mutex(互斥锁)

    互斥锁(Mutex) 互斥锁是一个互斥的同步对象,意味着同一时间有且仅有一个线程可以获取它. 互斥锁可适用于一个共享资源每次只能被一个线程访问的情况 函数: //创建一个处于未获取状态的互斥锁 Pub ...

  8. linux c学习笔记----互斥锁属性

    转自:http://lobert.iteye.com/blog/1762844 互斥锁属性 使用互斥锁(互斥)可以使线程按顺序执行.通常,互斥锁通过确保一次只有一个线程执行代码的临界段来同步多个线程. ...

  9. Linux线程-互斥锁pthread_mutex_t

    在线程实际运行过程中,我们经常需要多个线程保持同步.这时可以用互斥锁来完成任务:互斥锁的使用过程中,主要有pthread_mutex_init,pthread_mutex_destory,pthrea ...

随机推荐

  1. Java中的日期、时间操作

    每次在处理日期时间的时候都要打开chrome查找一番,索性自己找一下满意的记录下来. 一.时间格式 // hh表示12小时制: HH表示24小时制 SimpleDateFormat format1 = ...

  2. C51 中断 个人笔记

    总架构图 IE寄存器 控制各个中断源的屏蔽与允许 TCON寄存器 各个中断源的请求标志位&有效信号的规定 中断源及其优先级 中断号写程序的时候要用 CPU处理中断三原则 1.CPU同时接收到几 ...

  3. python virtualenv 管理工具 - virtualenvwrapper

    我们使用python virtualenv构建不同的python环境,python3 也加入了virtualenv 模块. virtualenvwrapper 提供了更便捷的 virtualenv环境 ...

  4. 2016 Multi-University Training Contest 3-1011.Teacher Bo,暴力!

    Teacher Bo                                                         Time Limit: 4000/2000 MS (Java/Ot ...

  5. CSU 1259 bfs找最短路

    题目大意: 不想介绍,题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1259 bfs求最短路. 这里因为2-9,到达同样的点不计步数,那我 ...

  6. [luoguP1082] 同余方程(扩展欧几里得)

    传送门 ax≡1(mod b) 这个式子就是 a * x % b == 1 % b 相当于 a * x - b * y == 1 只有当 gcd(a,b) == 1 时才有解,也就是说 ax + by ...

  7. 2018/2/15 ES Beats的学习笔记

    Beats其实是几种服务的统称(你也可以把收集到的数据存储到别的数据源,不一定非要ES),这几种服务分别是: 1.PacketBeat 通过抓包的方式来监控一些服务.如:HTTP,DNS,Redis, ...

  8. 「CodePlus 2017 11 月赛」Yazid 的新生舞会

    n<=500000的数字,问有多少个区间的众数出现次数严格大于区间长度的一半. 这么说来一个区间就一个众数了,所以第一反应是枚举数字,对下标进行处理.然后没有第二反应.很好. 在枚举一个数字的时 ...

  9. QT-Embedded-4.5.3在海思35xx上移植

    QT4.5.3在海思3520A上移植步骤-修订版 2015年3月29日星期日, 16:59:03 1.首先要保证已经安装了海思的交叉编译器: #arm-hi  + Tab key to show wh ...

  10. 51nod 1010 只包含因子2 3 5的数 && poj - 1338 Ugly Numbers(打表)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1010 http://poj.org/problem?id=1338 首先 ...