Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
信号量_semaphore
rt_thread的二值信号量,先后被两个线程take,为何不是我预想的结果?
发布于 2020-11-18 16:42:46 浏览:1446
订阅该版
![创建信号量和线程.jpg](/uploads/20201118/6e72cc29192a4d7c3075a7a9ff3c3b12.jpg) ![输出结果.png](/uploads/20201118/08647266f9cf129951921d18fbfc54ac.png) 创建信号量为优先级优先方式,不是FIFO方式。 receive线程优先级是3,比较低。 send线程优先级是2,比较高。 程序跑起来,receive线程会先跑到take信号量而阻塞。随后到send线程释放信号量并且继续跑到send的take信号量,这时候send的优先级比receive高,为何跑回receive来take信号量并打印Sucessful了呢?
查看更多
yangjie
认证专家
2020-11-18
hello
线程优先级抢占决定的哪个线程先运行。 先解释运行过程: main 函数 优先级 20 ,先创建一个优先级3并启动(优先级高),之后就会切换到优先级3的线程,优先级3的线程挂起之后,才会运行main,接着创建优先级为2的线程。 ``` 你说的这句话有误: 程序跑起来,receive线程会先跑到take信号量而阻塞。随后到send线程释放信号量并且继续跑到send的take信号量,这时候send的优先级比receive高,为何跑回receive来take信号量并打印Sucessful了呢? 应该为: 程序跑起来,receive线程会先跑到take信号量,此时不会阻塞,因为你初始化为1,会马上获取到信号量,然后向下运行,在LV3 delay的时候,会切换到mian创建send线程。后面的逻辑你自己可以理理。 ``` 如果你创建的两个线程优先级都低于20的,例如 25 26,那么运行过程就是:运行main,创建25 的线程并启动,优先级25低所以不切换,接着创建优先级为26 的线程并启动,main 线程运行结束退出。接下来开始调度系统中剩余的线程(包含 25 26),此时哪个优先级高就先运行哪个。
3
个回答
默认排序
按发布时间排序
踩姑娘的小蘑菇
2020-11-18
这家伙很懒,什么也没写!
如果想测试信号量的take优先级机制,通用做法应该是让这两个线程一起阻塞在take函数,第3个线程去释放,这个能测到实际能获取到的线程
lijinqiao2010
2020-11-19
这家伙很懒,什么也没写!
我知道原因了,原来是释放就马上被take走了,但因为take走的线程因为优先级不够无法调度成功,但却能take走,所以依然在高等级线程运行,当高等级线程遇到take时,但由于已经被低等级线程take走了(之前我以为低等级线程没有take成功),造成高等级线程堵塞,然后发生了调度,然后回到了已经就绪的低等级线程打印了。
撰写答案
登录
注册新账号
关注者
0
被浏览
1.4k
关于作者
lijinqiao2010
这家伙很懒,什么也没写!
提问
2
回答
1
被采纳
0
关注TA
发私信
相关问题
1
怎样可以将信号量复位为初始值
2
rt_sem_take 引起段错误
3
生产者消费者中是否可以使用一个事件集来代替多个二值信号量?
4
看RTT文档,不太懂有关信号量的死锁问题
5
这样使用UART接收一帧数据的方法是否可行
6
一对多线程间通信的问题
7
动态内存堆 保护全局变量lfree,为什么用信号量而不是互斥信号量
8
二值信号量的使用问题
9
USART1_IRQHandler串口中断接收问题
10
开发文档semaphore_sample.c有问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
RT-Thread项目助手v0.2.0 - 支持Env Windows
2
RttreadV5.10上,GD32F450Z RTC时间显示问题
3
rt-smart启动流程分析
4
EtherKit快速上手PROFINET
5
RTThread USB转串口无法接收数据
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部