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

1、互斥锁概念:

  互斥锁提供一个可以在同一时间,只让一个线程访问临界资源的的操作接口。互斥锁(Mutex)是个提供线程同步的基本锁。上锁后,其他的线程如果想要锁上,那么会被阻塞,直到锁释放后。

如果,在锁释放后,有多个线程被阻塞,那么,所有的被阻塞的线程会被设为可执行状态。第一个执行的线程,取得锁的控制权,上锁。其他的线程继续阻塞。

2、互斥锁系统原型

  互斥锁的系统原型为:pthread_mutex_t,在用互斥锁之前,必须要初始化互斥锁,可以调用pthread_mutex_init;或者是PTHREAD_MUTEX_INITIALZER(仅用于静态分配内存)如果我们动态分配互斥锁(比如,用malloc),那么,在释放内存之前,必须调用pthread_mutex_destroy;

下面为互斥锁初始化和销毁的函数原型:

  1. int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
  2.  
  3. int pthread_mutex_destroy(pthread_mutex_t *mutex);
  4.  
  5. int pthread_mutex_lock(pthread_mutex_t *mutex);
  6.  
  7. int pthread_mutex_unlock(pthread_mutex_t *mutex);

3、CEC处理互斥锁的使用

  1. ./aps/application/daemon/src/umf_cec.c
  2.  
  3. pthread_mutex_t as_mutex;
  4.  
  5. //获取锁,即初始化
  6. void CECTV_Init(CECTV_ModualCfg_t *pCEC_ModualCfg)
  7. {
  8. CEC_t *pcec = cec_GetHandle();
  9.  
  10. if (pcec->bCECExecuted)
  11. return;
  12. pcec->menuState = MS_DEACTIVATED;
  13. pcec->LogAddr = g_pKMFShareData->CecLogAddr;
  14. pcec->inputSource = g_pKMFShareData->CecPwrOnSrc;
  15. #ifdef CONFIG_HDMI_ALL_PORT_TERMINATION_ON
  16. pcec->bActiveSrcCheck = TRUE;
  17. #endif
  18. //bCHScanStop = TRUE;
  19. //HPStatus = FALSE;
  20. CecAudioARC = FALSE;
  21. //cecHdmiPortStatus = ptv->pKMFShareData->iHDMIStatus;
  22. //bAudioModeOn = ptv->pMenuSetting->CecAudioARC;
  23. bAudioModeOn = FALSE;
  24.  
  25. UmfHandler_Register(cec_CecdHandler);
  26. cecd_enable();
  27. pcec->bCECExecuted = TRUE;
  28.  
  29. pthread_mutex_init(&as_mutex, NULL); //申请锁
  30.  
  31. }
  32. //使用锁
  33. HRESULT cec_ReportActiveSource(CEC_t *pcec, CECDMSG_NOTICECECD *pnotice)
  34. {
  35. CECTV_MessageBody_t stEvt;
  36.  
  37. UMFDBG(,"Receive %s, toSrc=%d, inputSrc=%d, LogAddr=%d, viewonState=%d\n",__FUNCTION__, pnotice->toSrc,
  38. pcec->inputSource, pnotice->active_logAddr, pnotice->viewon_state);
  39. pcec->menuState = MS_DEACTIVATED;
  40.  
  41. if (pcec->inputSource != pnotice->toSrc)
  42. {
    if (bBlockActiveSrc)
  43. {
  44. //bBlockActiveSrc = FALSE;
  45. return S_OK;
  46. }
  47. else
  48. {
  49. bBlockActiveSrc = TRUE;
  50. pthread_mutex_lock(&as_mutex);
  51. pthread_cond_signal(&as_cond);
  52. pthread_mutex_unlock(&as_mutex);
  53. }
    }
  54. }

4、NVM互斥锁 API

  1. int Cmd_NVMInital(void)
  2. {
  3. if (gFlashWriteMutex == NULL)
  4. {
  5. GL_MutexCreate("NVMWriteMutex", &gFlashWriteMutex);
  6. if (gFlashWriteMutex == NULL)
  7. {
  8. return -;
  9. }
  10. }
  11.  
  12. return ;
  13. }
  14.  
  15. int Cmd_NVMUninital(void)
  16. {
  17. if (gFlashWriteMutex != NULL)
  18. {
  19. GL_MutexLock(gFlashWriteMutex);
  20. GL_MutexDelete(gFlashWriteMutex);
  21. gFlashWriteMutex = NULL;
  22. }
  23. return ;
  24. }
  25.  
  26. int Cmd_NVMLOCK(void)
  27. {
  28. GL_MutexLock(gFlashWriteMutex);
  29.  
  30. return ;
  31. }
  32.  
  33. int Cmd_NVMUNLOCK(void)
  34. {
  35. GL_MutexUnlock(gFlashWriteMutex);
  36.  
  37. return ;
  38. }

在读写FLASH时原子操作,使用使用互斥锁

  1. INT8 Cmd_FlashWrite(UINT32 destAddr, UINT32 srcAddr, UINT32 size)
  2. {
  3. FlashControl_t flashctrl = {};
  4. INT8 retval;
  5.  
  6. flashctrl.op = KMF_OP_SET;
  7. flashctrl.destAddr = destAddr;
  8. flashctrl.srcAddr = srcAddr;
  9. flashctrl.size = size;
  10. GL_MutexLock(gFlashWriteMutex);
  11. retval = ioctl(kmfdev, KMF_IOC_FLASHCTRL, &flashctrl);
  12. GL_MutexUnlock(gFlashWriteMutex);
  13.  
  14. return retval;
  15. }

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下TP5 隐藏入口文件+支持pathinfo模式+配置多项目根目录

    首先说下项目目录情况  跟目录/usr/share/nginx/html/(别说怎么这么深  0.0) html文件夹下面两个目录 pssh  pssh_shop 两个tp5项目分别对应两个二级域名 ...

  2. linux虚拟环境搭建

    一.virtualenv的安装与使用 1.安装virtualenv pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple virtualen ...

  3. Caused by: java.io.IOException: 您的主机中的软件中止了一个已建立的连接。

    异常详情 2017-07-16 10:55:26,218 ERROR [500.jsp] - java.io.IOException: 你的主机中的软件中止了一个已建立的连接. org.apache. ...

  4. UVA 227 周期串

    题意: 给一个字符串,寻找最短的循环节 如abcabcabcabc以3为周期,也按6和12为周期. 分析: 因为循环节肯定是相等的,所以枚举串长度的所有约数的循环节再判断是否相等即可. 我的方法是枚举 ...

  5. Fiddler基本用法:手机抓包1

    Fiddler基本用法以及如何对手机抓包 一.Fiddler是什么? ·一种Web调试工具. ·可以记录所有客户端和服务器的http和https请求. ·允许监视.设置断点.修改输入输出数据. 官方文 ...

  6. centos相关

    查看虚拟机里的Centos7的IP:ip addr或者ifconfig  ---https://blog.csdn.net/dancheren/article/details/73611878 Cen ...

  7. 爬虫(1):requests模块

    requests介绍: reqeusts模块:python原生一个基于网络请求的模块,模拟浏览器发起请求. requests模块的优点: - 1.自动处理url编码 - 2.自动处理post请求的参数 ...

  8. Linux下汇编语言学习笔记30 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  9. Ubuntu 16.04无法在WPS中输入中文的问题解决

    1. sudo gedit /usr/bin/wps 增加 export XMODIFIERS="@im=fcitx" export QT_IM_MODULE="fcit ...

  10. delphi异步选择模型编程TCP

    Server端: unit U_FrmServer; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, ...