当前位置: 首页 > news >正文

FreeRTOS的互斥锁(互斥信号量)使用

文章目录

    • 互斥锁的作用
    • 互斥锁的使用
      • 需要引用的头文件
      • 定义声明
      • 创建
      • 使用

互斥锁的作用

互斥锁(mutex)的作用是同步对共享资源的访问,确保在任意时刻只有一个线程可以访问共享资源,从而避免竞争条件(race condition)的发生。

具体来说,互斥锁有以下几个作用:

  1. 保护共享资源:当多个线程同时访问共享资源时,互斥锁可以确保只有一个线程可以访问该资源,避免出现数据不一致或错误的情况。

  2. 防止竞态条件:互斥锁可以用来解决竞态条件(race condition)的问题。竞态条件指的是当多个线程同时执行时,最终的结果取决于线程的执行顺序。通过使用互斥锁,可以防止竞态条件的发生,保证结果的可靠性。

  3. 实现线程互斥:互斥锁可以用来实现对共享资源的互斥访问,即同一时刻只有一个线程可以访问共享资源,其他线程需要等待互斥锁释放才能继续执行。

总的来说,互斥锁的作用是确保多个线程对共享资源的安全访问,避免出现数据竞争和不一致的情况。

互斥锁的使用

需要引用的头文件

#include "FreeRTOS.h" 
#include "task.h" 
#include "semphr.h"

定义声明

QueueHandle_t MutexSemaphore;

创建

在main函数中创建

MutexSemaphore = xSemaphoreCreateMutex();

使用

一般来说是为了解决资源争抢问题,所以用的情况是:

A要用B特有的资源,比如说数组、结构体,A用的时候B不能用,B用的时候A不能用

下面的这个例子就是page_update()内含cont_update(),而cont_update被另外一个线程调用的情况。

void test()
{xSemaphoreTake(MutexSemaphore, portMAX_DELAY); /* 获取互斥信号量 */cont_update();xSemaphoreGive(MutexSemaphore); /* 释放互斥信号量 */
}void task1()
{task1_init();while(1){xSemaphoreTake(MutexSemaphore, portMAX_DELAY); /* 获取互斥信号量 */page_update();xSemaphoreGive(MutexSemaphore); /* 释放互斥信号量 */}
}void task2()
{task2_init();while(1){...(省略若干函数逻辑)......test();...}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • grafana大坑,es找不到时间戳 | No date field named timestamp found
  • C语言 | Leetcode C语言题解之第240题搜索二维矩阵II
  • 【BUG】已解决:java.lang.reflect.InvocationTargetException
  • 设计模式-Git-其他
  • 游戏常用运行库安装包 Game Runtime Libraries Package
  • 期值(future)
  • Linux_线程的同步与互斥
  • Elasticsearch基础(五):使用Kibana Discover探索数据
  • Mybatis——动态SQL常用标签
  • JavaWeb笔记_Cookie
  • 企业微信PC版应用跳转到默认浏览器,避坑指南,欢迎补充(Vue项目版)。。。
  • IVI(In-Vehicle Infotainment,智能座舱的信息娱乐系统)
  • 深度学习落地实战:人脸面部表情识别
  • 【Android Framewrok】Handler源码解析
  • L298N的输出电流与电压
  • [PHP内核探索]PHP中的哈希表
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • @jsonView过滤属性
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • Cookie 在前端中的实践
  • hadoop集群管理系统搭建规划说明
  • JavaScript新鲜事·第5期
  • Mithril.js 入门介绍
  • MySQL的数据类型
  • NSTimer学习笔记
  • python3 使用 asyncio 代替线程
  • Vue 动态创建 component
  • vue-cli在webpack的配置文件探究
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 分布式事物理论与实践
  • 将回调地狱按在地上摩擦的Promise
  • 力扣(LeetCode)357
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • #### golang中【堆】的使用及底层 ####
  • #07【面试问题整理】嵌入式软件工程师
  • #HarmonyOS:基础语法
  • #QT(串口助手-界面)
  • (1)STL算法之遍历容器
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (力扣)循环队列的实现与详解(C语言)
  • (每日一问)基础知识:堆与栈的区别
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (转)socket Aio demo
  • (转)负载均衡,回话保持,cookie
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .bat批处理(一):@echo off
  • .jks文件(JAVA KeyStore)
  • .Net - 类的介绍
  • .Net CoreRabbitMQ消息存储可靠机制
  • .NET NPOI导出Excel详解
  • .NET Remoting学习笔记(三)信道