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

zephyr线程同步

概述

在多线程应用程序中,当多个线程同时运行时,便产生了线程同步的需求。本课程将阐述线程同步的必要性,并讲解如何使用信号量和互斥锁作为线程同步机制。
在练习部分,我们将重点介绍两种常见的线程同步问题,并展示如何使用信号量和互斥锁来解决这些问题。

目标

  • 理解线程同步机制的需求
  • 学习信号量和互斥锁的基本属性
  • 通过动手练习,掌握如何使用信号量和互斥锁进行线程同步

线程同步

在多线程应用程序中,存在多个线程同时运行的情况。如果超过一个线程试图同时访问同一资源(变量、数据结构等),通常这被称之为关键区段,这可能会导致出现意外或错误的行为。这正是需要实现线程同步的地方;它是一种机制,旨在确保在任何给定时刻只有一条线程执行关键区段

实现线程同步的两个机制是信号量或互斥锁。它们具有一些不同的特性,但本质上都属于在临界区前后由线程进行更改的变量,以确保其他线程无法先于该线程完成该段代码的执行。主要区别在于信号量拥有一个在初始化时设定的最大值,而互斥锁则具有所有权属性,即只有增加其值的线程才能减少其值,直至降至零时将其释放。

在接下来的章节中,我们将更详细地探讨信号量和互斥锁这两种机制,包括其属性列表及可视化展示。此外,还需完成两项练习,以实践如何将信号量和互斥锁作为三种同步机制加以运用。

信号量

最简单的形式下,信号量仅是一个普通的变量,它会发生变化,用以指示共享资源的当前状态。信号量可以被视作一种资源共享机制,其中你拥有一种有限的资源实例,而你需要管理该资源对多个线程的访问。它更多地是一种用于控制对特定数量资源实例访问的信号机制。

信号量具有以下特性:

  • 在初始化时,您设置一个初始计数(大于或等于0)和一个最大限制。
  • “Give”将递增信号量计数,除非计数已达到最大限制,在这种情况下信号不会递增。Givee”可以在任何线程或ISR中执行。
    -“Take” 操作会减少信号量计数,除非该信号量不可用(计数值为零)。任何试图获取一个不可用信号量的线程都需要等待,直至有其他线程使其变为可用(即释放该信号量)。“Take” 操作只能在线程中进行,而不可在中断服务例程(ISR)中执行(尽管内核确实允许ISR获取信号量,但ISR不得尝试在信号量不可用的情况下进行等待)
  • 获取信号量的线程不具备优先级继承资格,因为获取线程并不拥有该信号量,而其他任何线程都可以释放该信号量。

下图显示了信号旗的属性

互斥锁

与信号量不同,互斥锁只能处于两种状态,通常被称为“锁定”或“解锁”。此外互斥锁具有所有权属性,即只有锁定该互斥锁的线程才能将其解锁。可以将其视为一种带有单一钥匙的锁定/解锁机制,其中线程希望获取对某个对象的访问权。例如,一段代码或一项资源需要首先获取对未锁定互斥锁的访问权,然后锁定它,接着才能访问该对象。如果尝试获取互斥锁的线程发现该互斥锁已被锁定,那么该线程会被阻塞,并需等待锁定该互斥锁的线程将其解锁。

互斥锁的一种典型用途是保护代码中的关键部分,该部分可由多个线程访问。关键部分是一段代码,它需要在不受其他线程干扰的情况下完成,否则该关键部分内的全局/静态数据可能会遭到误读或损坏。

互斥锁具有以下属性:

  • 锁定一个互斥锁会递增锁定计数。递归锁定(可重入锁定)并不会使进行锁定的线程陷入阻塞状态,因为该线程已经持有了互斥锁。线程应确保它解锁互斥锁的次数与锁定时的次数相同,从而释放互斥锁,以便其他线程能够尝试获取它。
  • 解锁一个互斥锁会减少锁定计数。当锁定计数为零时,意味着该互斥锁处于未锁定状态。只有当互斥锁处于未锁定状态时,线程才能尝试获取其所有权。
  • 解锁一个互斥锁会减少锁定计数。当锁定计数为零时,意味着该互斥锁处于未锁定状态。只有当互斥锁处于未锁定状态时,线程才能尝试获取其所有权。
  • 只有锁定互斥锁的线程才能解锁它。
  • 互斥锁的锁定和解锁只能在线程中进行,而不能在ISR中执行。这是因为ISR无法参与调度器的所有权和优先级继承机制。
  • 锁定互斥锁的线程有资格继承优先级,因为只有该线程才能解锁互斥锁。

下图显示了互斥属性

练习信号量

http://www.cnnetsun.cn/news/1442506.html

相关文章:

  • 基于 PLC 的罐装控制系统开发之旅
  • 【三载笔耕逐光,笃行致远赴新程】我的技术博客三周年记
  • 探索中大型异步电机电磁计算程序:从曲线到跨平台支持
  • 26年最新Java后端社招场景项目题总结!(附100w字面试题)
  • 别再手动切换收发!用SP3485搭建RS485自动收发电路,省掉一个MCU引脚
  • 3D视觉(七):PnP算法在AR头部姿态估计中的实战应用
  • 整理下目前国内各大OpenClaw一站式部署平台,5分钟就能用上OpenClaw,哪个好用?
  • MusePublic艺术创作引擎Matlab接口开发:艺术与科学的融合
  • c# 通过反射获取一个泛型属性上的特性的值
  • 5个AI驱动功能实现专业级图像背景处理:backgroundremover技术民主化实践
  • 手把手教你绕过Dify Marketplace限制:本地编译自定义异步节点插件(含TypeScript类型声明补全与调试断点配置)
  • SEO_如何通过内容SEO有效获取精准流量?(393 )
  • 16#三菱/西门子S7 - 200 PLC与组态王构建液料混合系统探秘
  • 5分钟搞定:用OpenAPI2MCP工具快速为AI模型接入企业API(附实战配置)
  • 绘画进阶指南:从线稿构图到二次元上色全流程资料教程
  • # 发散创新:基于Python的实时反作弊系统设计与实现在游戏开发和在线平台中,**反作弊机制**已成为保障公平性和用户体验的核心技术之
  • Dify离线部署实战:无网环境下的插件打包与依赖整合
  • Windows下YOLOv5环境搭建全攻略:从Python多版本管理到Pytorch精准配置
  • Windows下Telepresence避坑全记录:从安装报错到成功连接k8s集群
  • 佳易王小餐馆点餐管理系统软件功能观察与使用体验
  • 倍福TwinCAT实战:如何自定义监控风扇转速等控制器参数(附完整代码)
  • OpenClaw学习总结_II_频道系统_1:WhatsApp集成详解
  • 深度拆解A股财务分析:12个核心指标从公式到代码的完整实战
  • 【前端知识】React生态你了解多少?
  • Ubuntu18.04下D435i+Kalibr联合标定环境搭建避坑指南(附ROS Melodic配置)
  • 【路径规划】在二维和三维空间中实现RRT_算法,根据障碍物位置和尺寸实现的避障功能附matlab代码
  • Cloudflare Pages + Hexo 博客部署全攻略:从零开始到国内访问优化
  • 别再只写ETL了!用Kettle PDI + Git打造团队可维护的数据流水线(含实战配置)
  • Jimeng AI Studio模型蒸馏实战:小模型大性能
  • 国产RISC-V单片机也能玩转MP3?Helix解码库移植避坑指南(附性能对比)