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

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

最新文章

  1. 简单说下COALESCE这个日常使用的函数
  2. SiteMesh3整合SpringMVC+FreeMarker
  3. 李洪强漫谈iOS开发[C语言-049]-猜数字游戏
  4. Java for LeetCode 074 Search a 2D Matrix
  5. LTIB常用命令3
  6. 论文笔记之:Multiple Object Recognition With Visual Attention
  7. VPN 隧道协议PPTP、L2TP、IPSec和SSLVPN的区别
  8. lintcode:Compare Strings 比较字符串
  9. SQL Server 索引结构及其使用(一)
  10. 程序员取悦女朋友的正确姿势---Tips(iOS美容篇)
  11. Android常用的一些make命令(转载)--不错
  12. 杭电15题 The Cow Lexicon
  13. Java:从面试题“i++和++i哪个效率高?"开始学习java字节码
  14. Python实现二叉树的四种遍历
  15. ##2.基础服务(SQl,RabbitMQ)-- openstack pike
  16. 重拾Python(1):使用Anaconda搭建Python开发环境(Windows7)
  17. JLOI2018 划水中...
  18. HTML之常用标签及属性
  19. 在Linux命令行中以图形化窗口打开文件夹
  20. linux下vim的安装及其设置细节

热门文章

  1. 搭建分布式yarn
  2. NodeJs中数据库的使用
  3. python3 监控代码变化 自动重启 提高开发效率
  4. [bzoj2822][AHOI2012]树屋阶梯 (卡特兰数+分解质因数+高精度)
  5. 关于c# .net爬虫
  6. C++ stringstream的用法
  7. POJ 2479 两段连续最大和
  8. 确定位置的经纬度LocationUtil
  9. POJ 1769_Minimizing maximizer
  10. webstrom设置代码缩进四个空格