一、临界资源

临界区资源是指一次仅允许一次线程的访问的共享资源。它可以是一个具体的硬件设备,也可以是一个变量、一个缓冲区。

不论是硬件临界资源,还是软件临界资源,多个线程必须互斥地对他们进行访问。

临界区

每个线程中访问(操作)临界区资源的那段代码称为临界区(Critical Section), 我们每次只允许一个线程进入临界区。

二、关闭系统调度

1.禁止调度
禁止调度,既是把调度器锁住,不让其他进行线程切换。这样就能保证当前能保证当前运行的任务不被换出,直到调度器解锁,所以禁止调度是常用的临界区保护方法。
2.关闭中断
因为所有的线程的调度都是建立在中断的基础上的,所以,当我们关闭中断后,系统将不能再进行调度,线程自身也自然不会被其他线程抢占了。

三、临界区保护实例

线程代码:

/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date           Author       Notes * 2018-08-24     yangjie      the first version */ /* 程序清单:关闭中断进行全局变量的访问 */
#include <rthw.h>
#include <rtthread.h>#define THREAD_PRIORITY      20
#define THREAD_STACK_SIZE    512
#define THREAD_TIMESLICE     5/* 同时访问的全局变量 */
static rt_uint32_t cnt;
void thread_entry(void *parameter)
{rt_uint32_t no;rt_uint32_t level;no = (rt_uint32_t) parameter;while (1){/* 关闭中断 */level = rt_hw_interrupt_disable();cnt += no;/* 恢复中断 */rt_hw_interrupt_enable(level);rt_kprintf("protect thread[%d]'s counter is %d\n", no, cnt);rt_thread_mdelay(no * 10);}
}/* 用户应用程序入口 */
int interrupt_sample(void)
{rt_thread_t thread;/* 创建t1线程 */thread = rt_thread_create("thread1", thread_entry, (void *)10,THREAD_STACK_SIZE,THREAD_PRIORITY, THREAD_TIMESLICE);if (thread != RT_NULL)rt_thread_startup(thread);/* 创建t2线程 */thread = rt_thread_create("thread2", thread_entry, (void *)20,THREAD_STACK_SIZE,THREAD_PRIORITY, THREAD_TIMESLICE);if (thread != RT_NULL)rt_thread_startup(thread);return 0;
}/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(interrupt_sample, interrupt sample);


注意:在关闭中断的过程中,是不会被其他线程抢去的,所以在关闭中断中,只会有这一段代码进行编译;如果,我们不恢复中断设置的话,会出现线程死锁的状态,不会跳出此线程;

RT_thread 临界区保护相关推荐

  1. RT-Thread学习笔记五——临界区与临界区保护

    目录 临界区: 临界区保护方法: 1.禁用系统调度器 2.禁用中断 临界区示例代码: 临界区: 一次仅只能有一个线程访问的共享资源,可以为一个具体的硬件设备,也可以是一个变量,一个缓冲区,但是,无论软 ...

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

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

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

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

  4. linux 临界区保护方法,操作系统-信号量临界区保护

    什么是信号量?通过对这个量的访问和修改,让大家有序推进 1. 共同修改信号量引出的问题 2. 竞争条件 3. 解决竞争条件的直观想法 4. 临界区 临界区:临界区是指进程中的一段需要访问共享资源并且另 ...

  5. freeRtos学习笔(3)临界区管理

    freeRtos学习笔记 freeRtos临界区管理 freeRtos临界区 代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许任何中断打断.为确保临界段代码的执行不被中断,在进入临界段之前须 ...

  6. ucos中的三种临界区管理机制

    熟悉ucos,或者读过Jean.J.Labrosse写过的ucos书籍的人,一定会知道ucos中著名的临界去管理宏:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL(). 同样 ...

  7. 解开 Windows 下的临界区中的代码死锁(转)

    摘要 临界区是一种防止多个线程同时执行一个特定代码节的机制,这一主题并没有引起太多关注,因而人们未能对其深刻理解.在需要跟踪代码中的多线程处理的性能时,对 Windows 中临界区的深刻理解非常有用. ...

  8. 解开 Windows 下的临界区中的代码死锁

    解开 Windows 下的临界区中的代码死锁 发布日期: 1/13/2005 | 更新日期: 1/13/2005 Matt Pietrek和 Russ Osterlund 本文假定您熟悉 Win32. ...

  9. 临界区,互斥量,信号量,事件的区别

    临界区(Critical section)与互斥体(Mutex)的区别 1.临界区只能用于对象在同一进程里线程间的互斥访问:互斥体可以用于对象进程间或线程间的互斥访问. 2.临界区是非内核对象,只在用 ...

  10. Delphi中线程类TThread实现多线程编程2---事件、临界区、Synchronize、WaitFor……

    接着上文介绍TThread. 现在开始说明 Synchronize和WaitFor 但是在介绍这两个函数之前,需要先介绍另外两个线程同步技术:事件和临界区 事件(Event) 事件(Event)与De ...

最新文章

  1. win10系统英雄联盟老是重新连接服务器,win10lol重新连接无法连接服务器重试该怎么才能解决...
  2. casperjs ajax请求,Casperjs ajax调用 - waitForResource和解析错误
  3. linux 特定用户ssh,linux - 如何在登录后将SSH用户限制为一组预定义的命令?
  4. js数组如何按照固定的下标去重_js数组去重方法总结
  5. php mvc登陆注册,Asp.Net MVC 5使用Identity之简单的注册和登陆
  6. 直播电商要处理好五个关系
  7. windows mysql 自动备份_windows mysql 自动备份的几种方法总结--岁月博客提供
  8. mongoDB - 插入数据
  9. 响应式图片srcset全新释义sizes属性w描述符
  10. 新的vulkan的SDK很难下载
  11. 基于LED的室内可见光通信系统
  12. 商品库存的扣除过程中如何防止超卖?
  13. DDoS攻击--CC攻击防护详解(HTTP)
  14. Python数据类型-list得切片(slices)
  15. 计算机蓝牙快捷键,笔记本蓝牙快捷键是什么_怎么打开笔记本电脑蓝牙-win7之家...
  16. 关于十六进制发送和显示(VS上位机和下位机)
  17. B. Ternary String
  18. (转)实用Word使用技巧大全
  19. ppt中如何合并流程图_PPT流程图文件的合并
  20. Vue $attrs使用方式及使用场景

热门文章

  1. html三段式布局,移动端 三段式布局 (flex方式)
  2. GEE:LandTrendr时间序列曲线拟合
  3. 方法调用错误,例如:
  4. 2012年8月 至 2014年2月1日读书列表
  5. 使用u盘如何装linux系统教程视频教程,如何使用u盘安装linux系统
  6. Python 史上最全第三方库收集(第二弹)
  7. 怎样快速提高计算机能力,如何提高算术能力?不借助计算机、笔、纸等工具,怎么能快速心算出多位数计算结果?如:489x85 如:128965-98542有什么口决及速算的方法的详细步骤?...
  8. 计算机应届生的面试经验
  9. 用python画蜡笔小新的步骤_蜡笔小新 - python代码库 - 云代码
  10. 什么是云渲染?云渲染应用场景有哪些?