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

RT-Thread学习笔记(三):线程管理

线程管理

  • 线程管理相关概念
    • 什么是时间片轮转
    • 调度器锁
    • 线程运行机制
    • 线程的五种状态
  • 动态和静态创建线程区别
    • 动态和静态创建线程优缺点
    • RT-Thread动态线程管理函数
      • 动态创建线程
      • 动态删除线程
    • RT-Thread静态线程管理函数
      • 静态创建线程
  • 线程其他操作
    • 线程启动
    • 线程延时
    • 获得当前执行的线程句柄

线程管理相关概念

什么是时间片轮转

时间片轮转主要用于相同优先级的线程,按线程所需时间片大小轮流运行
每个线程都需要配置时间片, 时间片仅对优先级相同的就绪态线程有效, 系统对其进行调度约束线程单次运行时长。
假设有 2 个优先级相同的就绪态线程 A 与 B, A 的时间片为 10, B 的时间片为 5, 那么系统会在A、 B 线程间来回切换执行, 并且每次对 A 线程执行 10 个节拍的时长, 对 B 线程执行 5个节拍的时长。

调度器锁

调度器是操作系统的核心,其主要功能就是实现线程的切换,即从就绪列表里面找到优先级最高的线程,然后去执行该线程。
调度器锁用于部分代码,避免被线程机制抢占

rt_enter_critical(); /* 进入临界区 */
/* 用户把需要上锁的代码放在这里 */
rt_exit_critical(); /* 退出临界区 */

线程运行机制

线程具有独立的栈空间, 当进行线程切换时, 会将当前线程的上下文存在栈中, 当线程要恢复运行时, 再从栈中读取上下文信息, 进行恢复。线程栈还用来存放函数中的局部变量。

线程的五种状态

在这里插入图片描述
在这里插入图片描述

动态和静态创建线程区别

动态创建线程是在运行时才动态创建线程的控制块和堆栈空间
静态创建线程是在编译时就将线程的控制块和堆栈空间预分配好,然后再初始化启动;

动态和静态创建线程优缺点

  1. 动态创建线程优点
    对于非固定的线程(运行过程可以销毁,短暂使用的线程),灵活分配线程内存

  2. 静态创建线程优点
    对于固定线程,不会产生动态内存分配,确保线程创建成功
    创建速度快,用于确认线程的项目可提前发现内存是否不足

RT-Thread动态线程管理函数

动态创建线程

rt_thread_t  rt_thread_create(	const char *name,                  //线程名称void (*entry)(void *parameter),    //线程的入口函数void       *parameter,             //入口函数的参数指针rt_uint32_t stack_size,            //线程堆栈的大小rt_uint8_t  priority,              //线程优先级rt_uint32_t tick)                  //线程调度的时间片大小

创建成功,返回线程句柄;创建失败,返回RT_NULL

动态删除线程

rt_err_t rt_thread_delete(rt_thread_t thread); 

删除线程成功,返回RT_EOK ;删除线程失败,返回-RT_ERROR

RT-Thread静态线程管理函数

静态创建线程

rt_err_t 
rt_thread_init(struct rt_thread *thread,          //线程控制块指针const char       *name,            //线程名称void (*entry)(void *parameter),    //线程的入口函数void             *parameter,       //入口函数的参数指针void             *stack_start,     //线程堆栈的起始地址rt_uint32_t       stack_size,      //线程堆栈的大小rt_uint8_t        priority,        //线程的优先级rt_uint32_t       tick)            //线程调度的时间片大小

在这里插入图片描述

线程其他操作

线程启动

rt_err_t rt_thread_startup(rt_thread_t thread);

线程延时

rt_err_t rt_thread_sleep(rt_tick_t tick); // 以 1 个 OS Tick 为单位
rt_err_t rt_thread_delay(rt_tick_t tick); // 以 1 个 OS Tick 为单位
rt_err_t rt_thread_mdelay(rt_int32_t ms); // 以 ms 为单位

获得当前执行的线程句柄

rt_thread_t rt_thread_self(void);

相关文章:

RT-Thread学习笔记(三):线程管理

线程管理 线程管理相关概念什么是时间片轮转调度器锁线程运行机制线程的五种状态 动态和静态创建线程区别动态和静态创建线程优缺点RT-Thread动态线程管理函数动态创建线程动态删除线程 RT-Thread静态线程管理函数静态创建线程 线程其他操作线程启动线程延时获得当前执行的线程…...

pymysql连接Mariadb/Mysql出现错误(配置正确情况下)解决办法

场景:在kali中使用python中pymysql对Mariadb进行连接,在整个过程中配置全部正确,但是就是无法进行连接,提示结果如下: Access denied for user rootlocalhost解决办法:进入数据库中,将默认密码…...

数据仓库扫盲系列(1):数据仓库诞生原因、基本特点、和数据库的区别

数据仓库的诞生原因 随着互联网的普及,信息技术已经深入到各行各业,并逐步融入到企业的日常运营中。然而,当前企业在信息化建设过程中遇到了一些困境与挑战。 1、历史数据积存。 过去企业的业务系统往往是在较长时间内建设的,很…...

DataX-web安装部署和使用

DataX-web的环境准备 MySQL (5.5) 必选,对应客户端可以选装, Linux服务上若安装mysql的客户端可以通过部署脚本快速初始化数据库 JDK (1.8.0_xxx) 必选 DataX 必选 Python (2.x) (支持Python3需要修改替换datax/bin下面的三个python文件,替换文件在do…...

sqlmap防御以及文件读写

一.防御 过滤 1.使用过滤函数 $email filter_var($_POST[email], FILTER_VALIDATE_EMAIL); if ($email) { // input is a valid email address } else { // input is not a valid email address 使用 filter_var() 函数和 FILTER_VALIDATE_EMAIL 过滤器来验证用户输…...

【源码】C/C++运动会计分系统 期末设计源码

文章目录 题目介绍功能源码效果展示带报告(内容) 题目介绍 使用语言: 两个版本都会发: 版本1:C语言 版本2: C 代码量: 500 题目介绍: 要求:初始化输入:N-参赛…...

Ubuntu安装Docker

卸载官方库中之前的旧版本 sudo apt-get remove docker docker-engine docker-ce docker.io更新安装包列表 sudo apt-get update安装以下包以使apt可以通过HTTPS使用存储库 sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common添…...

useReducer+createContext真的可以代替Redux吗?

概念 useReducer useReducer 是 React 提供的一个状态管理钩子,通常用于管理组件的复杂状态逻辑。它采用两个参数:reducer 函数和初始状态。Reducer 函数接受当前状态和一个操作(action),并返回一个新的状态。这有点…...

Mysql忘记登入密码找回 方法(超详细)

如果你找不到 MySQL 的安装路径,可以尝试以下几种方法: 检查环境变量:打开命令提示符,并运行以下命令: echo %PATH% 这会显示系统的环境变量。查找其中是否包含 MySQL 相关的路径,例如 C:\Program Files…...

NodeMCU ESP8266 读取按键外部输入信号详解(图文并茂)

NodeMCU ESP8266 读取按键外部输入信号教程(图文并茂) 文章目录 NodeMCU ESP8266 读取按键外部输入信号教程(图文并茂)前言按键输入常用接口pinModedigitalRead 示例代码结论 前言 ESP8266如何检测外部信号的输入,通常…...

Oracle如何插入图片数据?

1、创建表,注意:插入图片的列要定义成BLOB类型 create table image_lob(t_id varchar2(5) not null,t_image blob not null);2、创建图片目录,images为目录名 create or replace directory "images" as f:\pic\;3、创建存储过程&am…...

C++特性——inline内联函数

1. 内联函数 1.1 C语言的宏 在C语言中,我们学习了用#define定义的宏函数,例如: #define Add(x, y) ((x) (y)) //两数相加相较于函数,我们知道宏替换具有如下比较明显的优点: 性能优势: 宏在预处理阶段…...

pensieve运行的经验

1运行run_videopy时出现如下问题: cmd: Union[List[str], str], ^ SyntaxError: invalid syntax原因是EasyProcess版本与python版本不对应,解决办法可见之前这篇博客:SyntaxError: invalid syntax。 2解决完上述问题后,输…...

Qt实现一个电子相册

一、要实现的功能 在窗口中可以显示图片,并且能够通过两个按钮进行图片的前进和后退的顺序切换。有一个按钮,通过这个按钮可以从所存图片资源中随机选取一个图片进行展示通过按钮可以控制图片自动轮播顺序切换的开始与停止,显示当前系统的时…...

R语言:因子分析 factor analysis

文章目录 因子分析数据集处理步骤主成分法做因子分析最大似然法做因子分析因子分析 因子分析的用途与主成分分析类似,它也是一种降维方法。由于因子往往比主成分更易得到解释,故因子分析比主成分分析更容易成功,从而有更广泛的应用。 从方法上来说,因子分析比主成分分析更为…...

SOFAStack软件供应链安全产品解析——SCA软件成分分析

近年来,软件供应链安全相关攻击事件呈快速增长态势,造成的危害也越来越严重,为了保障软件供应链安全,各行业主管单位也出台了诸多政策及技术标准。基于内部多年的实践,蚂蚁数科金融级云原生PaaS平台SOFAStack发布完整的…...

vue中ElementUi的el-table表格绑定行点击事件

<el-table v-loading"loading" :data"messagesList" row-click"goToMassage">handleRowClick(row, event, column) {// 在这里处理行点击事件console.log(行点击事件&#xff1a;, row, event, column);}...

力扣:盛最多水的容器

题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。 …...

3D双目跟踪瞳孔识别

人眼数据集通常用于眼部相关的计算机视觉、眼动追踪、瞳孔检测、情感识别以及生物特征识别等领域的研究和开发。以下是一些常见的人眼数据集&#xff1a; BioID Face Database: 这个数据库包含1,521张近距离的人脸图像&#xff0c;其中包括瞳孔位置的标记。它通常用于瞳孔检测和…...

【java】Java项目从开发到部署生产完整流程梳理

文章目录 前言一、开发环境二、项目搭建2.1 Maven创建项目2.1.1 创建maven项目2.1.2 引入依赖2.1.3 maven常用命令 三、SpringBoot基础配置四、项目打包4.1 打包jar4.2 打包war4.2.1 修改项目打包为war包4.2.2 排除内嵌的tomcat&#xff0c;引入外部tomcat4.2.3 添加servlet-ap…...

Magnet2Torrent高效转换指南:磁力链接永久保存的智能解决方案

Magnet2Torrent高效转换指南&#xff1a;磁力链接永久保存的智能解决方案 【免费下载链接】Magnet2Torrent This will convert a magnet link into a .torrent file 项目地址: https://gitcode.com/gh_mirrors/ma/Magnet2Torrent 你有没有这样的经历&#xff1f;辛辛苦苦…...

Python提高:条件断点的详解-由Deepseek产生

条件断点详解 条件断点&#xff08;Conditional Breakpoint&#xff09;是调试器中的一项高级功能&#xff1a;只有当用户指定的条件表达式为真&#xff08;True&#xff09;时&#xff0c;程序才会在该断点处暂停。 它解决了“普通断点会每次中断&#xff0c;导致大量无意义停…...

明日方舟自动化助手MAA:从入门到精通的完整游戏辅助指南

明日方舟自动化助手MAA&#xff1a;从入门到精通的完整游戏辅助指南 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手&#xff0c;全日常一键长草&#xff01;| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: https://g…...

突破Cursor Pro限制:cursor-free-vip工具深度解析与实战指南

突破Cursor Pro限制&#xff1a;cursor-free-vip工具深度解析与实战指南 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached yo…...

中兴C69E OLT升级避坑指南:从FTP配置到板卡激活,手把手搞定V1.2.2固件

中兴C69E OLT升级实战手册&#xff1a;V1.2.2固件全流程操作与关键细节解析 深夜的机房警报声突然响起&#xff0c;监控大屏上闪烁着某台C69E OLT的异常状态。作为值班工程师&#xff0c;你很清楚这意味着什么——又到了与固件版本搏斗的时刻。中兴OLT设备升级从来不是简单的&…...

不止是国产替代:聊聊openEuler在云原生和边缘计算里的那些‘黑科技’

不止是国产替代&#xff1a;openEuler在云原生与边缘计算中的技术突破 当开发者谈论现代操作系统时&#xff0c;往往聚焦于Linux内核的通用性&#xff0c;却忽略了不同场景下的特殊需求。openEuler正通过一系列技术创新&#xff0c;重新定义数字基础设施的操作系统体验。这不是…...

Redis事务处理详解:确保数据一致性的关键策略

Redis事务处理详解&#xff1a;确保数据一致性的关键策略 【免费下载链接】redis-doc Redis documentation source code for markdown and metadata files, conversion scripts, and so forth 项目地址: https://gitcode.com/gh_mirrors/re/redis-doc Redis事务是保障数…...

设计系统已死?AI时代的两种终极范式对决:Awesome DESIGN.md vs UI UX Pro Max

2026年4月&#xff0c;GitHub Trending榜单上一个名为"Awesome DESIGN.md"的项目以惊人的速度攀升&#xff0c;10天斩获4万星&#xff0c;20天突破10万星&#xff0c;创下了前端领域有史以来最快的增长记录。与此同时&#xff0c;一个名为"UI UX Pro Max"的…...

从圆柱绕流到涡街动画:我的第一个FLUENT瞬态仿真全记录(附Mesh文件与结果对比)

从圆柱绕流到涡街动画&#xff1a;我的第一个FLUENT瞬态仿真全记录 第一次打开FLUENT界面时&#xff0c;那些密密麻麻的菜单栏和参数设置让我有些手足无措。作为一个流体力学爱好者&#xff0c;我一直想亲手模拟出教科书上那个经典的卡门涡街现象——当流体绕过圆柱体时&#x…...

C# 14原生AOT部署Dify客户端全流程(含dify-sdk源码级patch与AOT友好的HttpClientFactory重构),仅限前500名开发者获取完整CI/CD流水线YAML

第一章&#xff1a;C# 14 原生 AOT 部署 Dify 客户端 实战案例C# 14 引入了更成熟的原生 AOT&#xff08;Ahead-of-Time&#xff09;编译支持&#xff0c;使 .NET 应用可脱离运行时独立部署&#xff0c;显著提升启动速度与资源占用效率。本章以构建轻量级 Dify API 客户端为例&…...