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

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. nginx虚拟主机配置实践

    1.配置基于域名的虚拟主机 [root@web01 html]# egrep -v "#|^$" /application/nginx/conf/nginx.conf.defaul ...

  2. Win2008 Server搭建流媒体服务(在线看电影)

    什么是流媒体服务呢. 所谓流媒体是指采用流式传输的方式在Internet播放的媒体格式, 与需要将整个视频文件全部下载之后才能观看的传统方式相比, 流媒体技术是通过将视频文件经过特殊的压缩方式分成一个 ...

  3. phtyon,通过while循环简单的用户名和密码登录

    _username='zhangxin' _password='abc123' _username1='zhaopeng' _password1='abc1234' _username2=" ...

  4. Windows 10 & Game Bar & YouTube & video records

    Windows 10 & Game Bar & YouTube & video records Windows 10 C:\Users\xgqfrms\Videos\Captu ...

  5. 博客搬迁至Gitcafe

    原先的Github pages貌似在国内被墙了,导致搜索引擎一直没有索引到,今天一怒之下迁到Gitcafe 虽然之前的模板用不成,害我重新找了一套,改了好半天,不过总算弄完了

  6. 餐巾(cogs 461)

    [问题描述] 一个餐厅在相继的N天里,第i天需要Ri块餐巾(i=l,2,…,N).餐厅可以从三种途径获得餐巾. (1)购买新的餐巾,每块需p分: (2)把用过的餐巾送到快洗部,洗一块需m天,费用需f分 ...

  7. 文件权限设置与http,php的关系

    在web服务器上的文件要使用什么权限比较好呢.我开始的时候直接都是777,后台安全部门的同事,通过漏洞把我管理的服务器给搞了.报告到我这里,我才意识到权限的设置不能马虎.环境采用nginx+php,一 ...

  8. tyvj1031 热浪

    背景 USACO OCT09 9TH 描述 德克萨斯纯朴的民眾们这个夏天正在遭受巨大的热浪!!!他们的德克萨斯长角牛吃起来不错,可是他们并不是很擅长生產富含奶油的乳製品.Farmer John此时以先 ...

  9. spring 邮件服务

    https://www.cnblogs.com/ityouknow/p/6823356.html https://www.cnblogs.com/nfcm/p/7843935.html

  10. 通过ICursor对Table进行操作(添加、修改、删除)

    通过ICursor对Table进行操作(添加.修改.删除) 2010-03-16 16:07:37|  分类: 工作|举报|字号 订阅 来自:http://blog.163.com/liuyang12 ...