1、临界资源、临界区

1.1、临界资源

任何时刻最多只允许一个线程去使用的资源。

进程间要以互斥的方式访问临界资源。

属于临界资源的硬件:打印机、音响、屏幕等;软件:消息队列,变量,数组,缓冲区等。

1.2、临界区

每个进程中访问临界资源的那段代码称为临界区(criticalsection)。

多个进程涉及到同一个临界资源的的临界区称为相关临界区。

使用临界区时,一般不允许其运行时间过长,只要运行在临界区的线程还没有离开,其他所有进入此临界区的线程都会被挂起而进入等待状态,并在一定程度上影响程序的运行性能。

2、如何保护临界区

2.1、关闭系统调度

  • 禁止中断
rt_base_t level;
level = rt_hw_interrupt_disable();
//......
rt_hw_interrupt_enable(level);
  • 关闭调度(还可响应中断)
rt_enter_critical();    //不再切换其他线程,但可以响应中断
//......
rt_exit_critical();

2.2、利用互斥

  • 信号量

二值信号量,即信号量的初始值为1,访问临界区时-1,访问完释放+1;

//初始化信号量
rt_sem_init(&sem_lock, "lock", 1 ,RT_IPC_FLAG_PRIO);
//访问临界资源时,上锁
rt_sem_take(&sem_lock, RT_WAITING_FOREVER);
//......
//访问完,解锁
rt_sem_release(&sem_lock);
  • 互斥量
/* 指向互斥量的指针 */
static rt_mutex_t dynamic_mutex = RT_NULL;
/* 创建一个动态互斥量 */
dynamic_mutex = rt_mutex_create("dmutex", RT_IPC_FLAG_PRIO);
if (dynamic_mutex == RT_NULL)
{rt_kprintf("create dynamic mutex failed.\n");return -1;
}
//开始访问临界资源
rt_mutex_take(dynamic_mutex, RT_WAITING_FOREVER);
//......
//结束访问临界资源
rt_mutex_release(dynamic_mutex);

RT_Thread_临界资源保护相关推荐

  1. FreeRTOS临界资源保护(临界区保护)

    临界区未保护出现的异常   有一种问题相信大家都不愿碰上,就是低概率偶现问题,这类问题的根源,根据作者的经验常见于以下四种情况: 野指针引用 数组越界 栈溢出 临界资源未保护   今天我们说说其中之一 ...

  2. Boost锁~临界区保护和临界资源共享

    前言: 除了thread,boost::thread另一个重要组成部分是mutex,以及工作在mutex上的boost::mutex::scoped_lock.condition和barrier,这些 ...

  3. freeRtos学习笔记 (7)信号量

    freeRtos学习笔记 freeRtos信号量 信号量种类 信号量分为四种:二值信号量,互斥信号量,计数信号量和递归互斥信号量,其中计数信号量用于管理系统多个共享资源,用计数值表示可用资源数目;二值 ...

  4. java holdslock_一种检测Java并发程序代码分支路径lock是否遗漏的方法

    开发java程序中,程序员往往会用synchronized lock 进行临界资源保护和线程同步:android平台上,提供了一些技巧来减少锁被错误使用:使用Locked后缀作为函数名字:Locked ...

  5. RTT的线程同步篇——信号量

    野火RTT 19章信号量 2018年12月29日 10:46 相当于裸机中的标志 信号量:实现线程间的通信,实现线程间的同步货临界资源的互斥访问. 多线程系统中,线程间需要同步或互斥实现临界资源保护. ...

  6. STM32使用串口DMA方式发送数据

    1.cubemx设置 1.1基本设置 1.2 打开DMA和中断 2.代码实现 HAL_UART_Transmit_DMA(&huart1,(uint8_t*)str,strlen(str)); ...

  7. Linux中断子系统

    首先感谢原文作者 LoyenWang 的分享,可以点击章节阅读原作者原文,或者查看本文的转载地址,再次感谢原作者分享,已经在公众号上征得作者同意. 说明: Kernel版本:4.14 ARM64处理器 ...

  8. 嵌入式阶段性学习总结

    转眼间近四个月的学习就结束了,我的这个阶段的生活也画上了句号.回想近四个月的学习.工作和生活上,有过震撼.诧异.怀疑,也有此刻越来越多的探求和欣喜,我感受最多的是自我在不断的成长和走向成熟,一个不断发 ...

  9. ThreadX内核源码分析(SMP) - 核间互斥(arm)

    1.核间互斥介绍(_tx_thread_smp_protection) 在单核的ThreadX内核中,内核的临界资源互斥通过关中断实现:在多核cpu上,关闭整个cpu的代价比较大,单核上仍然使用关中断 ...

最新文章

  1. 探索--是测试的必须品
  2. PHPsession工作机制以及销毁session
  3. SQL 语句中的字段名 如果是 关键字怎么办?
  4. 求一个字符串的前缀与另一个字符串的后缀的最大相同子串
  5. python综合管理系统_学生综合信息管理系统
  6. Redis两种客户端:lettuce和Jedis的区别
  7. UVA - 12412 ​​​​​​​A Typical Homework (a.k.a Shi Xiong Bang Bang Mang)
  8. 伯乐发卡系统源码 可用
  9. 2020前端最新面试题(vue篇)
  10. Docker组队学习(二)
  11. spring cloud简介之最好参考
  12. java replace三个参数_javascript replace()第二个参数为函数时的参数用法
  13. 学会计为什么要学计算机基础,会计专业学生为什么要学数据库
  14. 2022年软件评测师考试大纲
  15. 爬取cloudmusic歌单
  16. 【STM32训练—SIM900A模块】第一篇、电脑的串口助手驱动SIM900A发送中文和英文短信
  17. 【无标题】Access control configuration prevents your request from being allowed at this time.
  18. OBS显示器捕获黑屏问题解决
  19. Ethercat远程IO模块接线准则
  20. Vue3官网使用及简介

热门文章

  1. 浅谈接到一个别人做一半的项目如何去接手。
  2. 机械设计专业需要考计算机嘛,这8大工科专业,你们是这么报的吗?
  3. 什么是λ矩阵?什么是多项式矩阵?
  4. 信管1172-201711671226-WWY —JSP智能手机销售网后台设计
  5. 青龙面板改端口,远离5700,保姆教程
  6. jsPlumb.draggable()设置id时所遇问题
  7. ETL工具Talend最佳实践
  8. 跨平台C语言长连接之quene数据结构
  9. 美国名校计算机科学gre要求,没有GRE成绩怎样申请美国名校
  10. qemu运行riscv64 linux