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);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/162670.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java并发面试题:(六)悲观锁和乐观锁和Java内存模型和CAS原理

悲观锁和乐观锁的区别 什么是悲观锁? 基本上我们理解的操作前对资源加锁,操作完后释放锁。说的都是悲观锁。悲观锁认为所有的资源都是不安全的,随时会被其他线程操作、更改。所以操作资源前一定要加一把锁、防止其他线程访问。 什么是乐观锁&…

【23种设计模式】装饰器模式

个人主页:金鳞踏雨 个人简介:大家好,我是金鳞,一个初出茅庐的Java小白 目前状况:22届普通本科毕业生,几经波折了,现在任职于一家国内大型知名日化公司,从事Java开发工作 我的博客&am…

Excel·VBA单元格区域数据对比差异标记颜色

之前的一篇博客《ExcelVBA单元格重复值标记颜色》,是对重复的整行标记颜色 而本文是按行对比2个单元格区域的数据,并对有差异的区域(一个单元格区域有的,而另一个单元格区域没有的)标记颜色,且只要存在任意…

单链表经典OJ题:合并有序链表

目录 ​编辑 题目: 图例: 分析: 解法: 解法1: 解法2: 解法的对比: 解法2: 注意事项: 图例: 代码演示: 代码分析: 代码缺点: 重复…

[MySQL]BLOB/TEXT column ‘xxx‘ used in key specification without a key length

报错信息: SQLSTATE[42000]: Syntax error or access violation: 1170 BLOB/TEXT column xxx used in key specification without a key length 原因: MySQL的唯一索引不支持text类型的字段!

C++初阶-类和对象(上)

类和对象(上) 一、面向过程和面向对象初步认识二、类的引入三、类的定义四、类的访问限定符及封装访问限定符封装 五、类的作用域六、类的实例化七、类的对象大小的计算如何计算类对象的大小类对象的存储方式猜测 八、类成员函数的this指针this指针的引出…

网站如何才能不被黑,如何做好网络安全

当企业网站受到攻击时,首页文件可能被篡改,百度快照也可能被劫持并重定向到其他网站。首要任务是加强网站的安全防护。然而,许多企业缺乏建立完善的网站安全防护体系的知识。因此,需要专业的网站安全公司来提供相应的保护措施。今…

番外8.1 配置+管理文件系统

Task01: Linux 文件系统结构; 可以进行Linux操作系统的文件权限管理与方式切换,可以应用磁盘与文件权限管理工具; 01:常见文件系统类型(Ext4[rhel6默认文件管理系统], 存储容量1 EB1073741824 GB; XFS[rhel 7/8默认的文…

Radius OTP完成堡垒机登录认证 安当加密

Radius OTP(One-Time Password)是一种用于身份验证的协议,它通过向用户发送一个一次性密码来验证用户的身份。使用Radius OTP可以实现堡垒机登录,以下是一些实现步骤: 1、安装Radius服务器 首先需要安装Radius服务器…

【量化交易笔记】9.量化投资理论及一般流程

前言 在第7篇文章中指出,量化交易的主要有两方面应用,基于的数据主要是两个类型,如前面讲的用之前的数据预测股价,这类数据我们可归为纵向研究数据,又称时间序列数据,另一类是横截面数据,以称截…

关于CW32单片机pack包安装 KEIL IAR

CW32 系列微控制器软件开发工具入门 芯片包 1. 下载芯片包 官方下载链接:武汉鑫源半导体 2. 安装芯片包 双击芯片包.pack文件 支持 CW32F 系列的 IDE 支持 CW32F 系列的工具链: • • EWARM v7.70 或更高版本 MDK-ARM v5.17 或更高版本 2.1 EW…

Android MediaMetadataRetriever setDataSource failed: status = 0xFFFFFFEA

Android MediaMetadataRetriever setDataSource抛错: java.lang.RuntimeException: setDataSource failed: status 0xFFFFFFEA 原因是 setDataSource(String path) path指向的视频文件大小为0或者是破损视频资源。 Android AppGlideModule,DataFetcher,ModelLoad…

环境变量【使用命令行参数引出环境变量】

前提:命令行参数 大家在写C/C程序的时候肯定见过下面这种情况: main函数里面携带的参数,平常写代码过程中很少用到这两个参数,接下来我们就研究一下 我们也不知道 指针数组argv里面到底保存的是什么,也不知道这个a…

Spring 国际化:i18n

文章目录 i18n概述Java国际化Spring6国际化MessageSource接口使用Spring6国际化 i18n概述 国际化也称作i18n,其来源是英文单词 internationalization的首末字符i和n,18为中间的字符数。由于软件发行可能面向多个国家,对于不同国家的用户&…

Apacheb Shiro 1.2.4反序列化漏洞(CVE-2016-4437)

Apache Shiro 1.2.4反序列化漏洞(CVE-2016-4437) 1 在线漏洞解读: https://vulhub.org/#/environments/shiro/CVE-2016-4437/2 环境搭建 cd /home/kali/vulhub/shiro/CVE-2016-4437启动: sudo docker-compose up -d # 拉取下载并启动sud…

PyQt 小程序

设备管理程序 v0.0.1.0, 终于出了一个基础版本,… … 两个字典的键值判断 辛亏用的是Python 这个编码时间大大缩短了 对已有的命令行进行GUI 化 from typing import Optional import PySide6.QtCore import PySide6.QtWidgets from cmd_ui import Ui_MainWindow from PySide6.…

亚马逊测评关于IP和DNS的问题

最近不少人询问了关于IP和DNS的问题,在此进行一些科普。 当客户端试图访问一个网站时,首先会向其所在的ISP的DNS服务器进行查询。如果ISP的DNS服务器没有相关缓存,则会向上级DNS服务器进行查询。 一些诸如CDN之类的服务,可能会为…

uni-app小程序使用DCloud(插件市场)流程

一、DCloud(插件市场) DCloud 是uni-app官方插件市场,里面有官方、团队、个人发布的众多插件,包括uni-ui、uni-pay 等。而像uni-ui这种大型组件库都有官方文档可参考,但一些团队或个人发布的小型插件没有文档&#xf…

STM32-LCD液晶显示

LCD液晶显示 针对野火指南者配套资料:3.2寸 LCD电阻屏,屏幕里自带ILI9341液晶控制器芯片,该控制器芯片中存在GRAM(即显存)。该液晶控制器使用8080接口与单片机通讯,液晶面板引出来的FPC信号线为8080接口&am…

LeetCode算法刷题(python) Day42|09动态规划|62.不同路径、63. 不同路径 II

目录 LeetCode 62. 不同路径LeetCode 63. 不同路径II LeetCode 62. 不同路径 力扣题目链接 class Solution:def uniquePaths(self, m: int, n: int) -> int:dp [[1] * n for _ in range(m)]for j in range(n):for i in range(m):if i 0 and j > 0:dp[i][j] dp[i][j-1…