| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> 如何用生产者消费者问题学RT-Thread的线程间通信 -> 正文阅读 |
|
[Java知识库]如何用生产者消费者问题学RT-Thread的线程间通信 |
1 信号与任务调度据实时操作系统 2 RT-Thread和多线程
类似于多进程系统中的进程间通信方式,实时操作系统也提供了单核线程间的通信方式。信号量和互斥量就是用于线程间通信的工具。 3 信号量和信号信号量是一个结构体,它的原型如下。
我们在编程时可以声明各种信号量,当线程对信号量进行获取或者释放操作时,我们称其在获取或者释放信号。 声明一个
假设我们规定线程访问内存前必须先取得对应的锁,那么即使多个线程同时申请访问同一块内存,也不怕读写顺序是没有章法的,也就起到了保护内存访问秩序的作用。 4 互斥量广义上的互斥,指的就是内存只允许被一个线程访问。早期实现互斥,采取的是前面提到的名为“上‘锁’”的机制,即用一个二值信号量标志内存访问权是否被占用。 但这种老方法可能导致线程优先级翻转。 4.1 优先级翻转 就是就绪态的高优先级的线程后于相对低优先级的线程执行的异常情况。 有优先级为 A、B 和 C 的三个线程,优先级 A> B > C。线程 A,B 处于挂起状态,等待某一事件触发,线程 C 正在运行,此时线程 C 开始使用某一共享资源 M。在使用过程中,线程 A 等待的事件到来,线程 A 转为就绪态,因为它比线程 C 优先级高,所以立即执行。 但是当线程 A 要使用共享资源 M 时,由于其正在被线程 C 使用,因此线程 A 被挂起切换到线程 C 运行。如果此时线程 B 等待的事件到来,则线程 B 转为就绪态。由于线程 B 的优先级比线程 C 高,且线程B没有用到共享资源 M ,因此线程 B 开始运行,直到其运行完毕,线程 C 才开始运行。 只有当线程 C 释放共享资源 M 后,线程 A 才得以执行。在这种情况下,优先级发生了翻转:线程 B 先于线程 A 运行。这样便不能保证高优先级线程的响应时间。 4.2 解决优先级翻转问题 优先级继承是通过在线程 A 尝试获取共享资源而被挂起的期间内,将线程 C 的优先级提升到线程 A 的优先级别,从而解决优先级翻转引起的问题。 这样能够防止 C(间接地防止 A)被 B 抢占,如下图所示。优先级继承是指,提高某个占有某种资源的低优先级线程的优先级,使之与所有等待该资源的线程中优先级最高的那个线程的优先级相等,然后执行,而当这个低优先级线程释放该资源时,优先级重新回到初始设定。因此,继承优先级的线程避免了系统资源被任何中间优先级的线程抢占。 5 生产者消费者问题有关生产者消费者问题,详见【链接】 怎样在
这样,我们就可以使用线程、信号量和锁来转述这个问题:
6 在RT-Thread中复现PR问题的解决这个问题,咱看着代码说 包含线程相关的头文件
生产者线程
这个线程将重复十次同样的操作,首先用
获取仓库的锁。然后用
释放
消费者线程
这个线程将间隔地获取十次
然后减少仓库中产品的计数,即获取信号
最后释放锁
创建两个线程
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 23:00:13- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |